技术标签: # flowable 1024程序员节 flowable
Flowable
简介Flowable
是一个用 Java
编写的轻量级业务流程引擎。Flowable
流程引擎允许您部署 BPMN 2.0
流程定义(用于定义流程的行业 XML
标准)、创建这些流程定义的流程实例、运行查询、访问活动或历史流程实例和相关数据
Flowable
在将其添加到应用程序、服务、体系结构时非常灵活。您可以将引擎嵌入到您的应用程序或服务中,方法是包含 Flowable
库,该库作为 JAR
提供。因为它是一个 JAR
,所以可以很容易地将它添加到任何 Java
环境中:javase;servlet
容器,如 Tomcat
或 Jetty、Spring;javaee
服务器,如 JBoss
或 WebSphere
等。或者,您可以使用可流动的 restapi
通过 HTTP
进行通信。还有一些可流动的应用程序(Flowable Modeler、Flowable Admin、Flowable IDM 和 Flowable Task
),它们提供了用于处理流程和任务的现成示例 UI
Flowable
的 GitHub
官网:https://github.com/flowable/flowable-engine
Flowable
中文用户书册:https://tkjohn.github.io/flowable-userguide/#_advanced
现在市面上主流的流程引擎就一共有三个:
Activiti
Flowable
Camunda
这三个各有特点:
Activiti
目前是侧重云,他目前的设计会向 Spring Cloud
、Docker
这些去靠拢Flowable
核心思想还是在做一个功能丰富的流程引擎工具,除了最最基础的工作流,他还提供了很多其他的扩展点,我们可以基于 Flowable
实现出许多我们想要的功能(当然这也是小伙伴们觉得 Flowable
使用复杂的原因之一)Camunda
相对于前两个而言比较轻量级,Camunda
有一个比较有特色的功能就是他提供了一个小巧的编辑器,基于 bpmn.io
来实现的。如果你的项目需求是做一个轻巧的、灵活的、定制性强的编辑器,工作流是嵌入式的,那么可以选择 Camunda
工作流程图这块其实有一个统一的标准,那就是 BPMN
。BPMN
全称是 Business Process Model and Notation,中文译作业务流程模型和标记法,这个中文太绕口了,还是简称 BPMN
吧
这是一套图形化表示法,用图形来表示业务流程模型。BPMN
最初由业务流程管理倡议组织(BPMI, Business Process Management Initiative
)开发,BPMI
于 2005
年与对象管理组织(OMG, Object Management Group
)合并,并于 2011
年 1
月 OMG
发布 2.0
版本,同时改为现在的名称
一句话,就是流程图这块有一个特别古老的规范,那就是 BPMN
,而我们前面所说的无论是 Activiti、Flowable
还是 Camunda
,都是支持这个规范的,所以呢,无论你使用哪一个流程引擎,都可以使用同一套流程图
Flowable UI
的安装部署首先下载文件 Flowable
相关的资源,进入 https://github.com/flowable/flowable-engine/releases,选择版本下载,下载下来是一个 ZIP
压缩包,解压压缩会看到如下目录结构
进入 wars
目录,会看到 flowable-rest.war
和 flowable-ui.war
两个 war
文件,然后 cmd
执行如下命令
java -jar flowable-ui.war
如果一闪而过则检查 jdk
的环境变量配置。启动成功后,在浏览器中访问 http://localhost:8080/flowable-ui/#/
,默认的账号密码是:admin/test
我们先在 身份管理应用程序
中创建用户并授权
创建用户
填写详细信息
授权管理
最后完成的工作流程图如下
点击创建流程,填写相关的信息
进入流程图绘制界面
ID
:可以结合业务需求,业务可以根据不同步骤执行不同的业务操作ID
从而实现不同角色审批不同流程的效果EL
表达式,因此可以使用 ${}
${executeType=='YES'}
的意思是主管审批的时候传递一个 executeType
变量,并且 executeType
变量的值为 YES
的时候,则走到下一步(经理审批)${executeType=='YES'}
的意思是主管审批的时候传递一个 executeType
变量,并且 executeType
变量的值为 NO
的时候,则结束流程<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler"
exporterVersion="6.7.2">
<process id="MyLeave" name="MyLeave" isExecutable="true">
<documentation>员工请假流程</documentation>
<startEvent id="sid-159DD77D-9878-4288-AC29-B898E08DC216" flowable:formFieldValidation="true"></startEvent>
<userTask id="zgID" name="主管审批" flowable:assignee="张主管" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
<![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-1E8F84D7-6C11-4D88-84C9-B818474F880E" sourceRef="sid-159DD77D-9878-4288-AC29-B898E08DC216"
targetRef="zgID"></sequenceFlow>
<exclusiveGateway id="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"></exclusiveGateway>
<sequenceFlow id="sid-08020782-2DDE-4C56-BFC0-224DC99FB50E" sourceRef="zgID"
targetRef="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"></sequenceFlow>
<endEvent id="sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB"></endEvent>
<userTask id="jlID" name="经理审批" flowable:assignee="李经理" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
<![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<exclusiveGateway id="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"></exclusiveGateway>
<sequenceFlow id="sid-833DAA1C-F1C2-41A1-8455-3FAB79893C14" sourceRef="jlID"
targetRef="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"></sequenceFlow>
<endEvent id="sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F"></endEvent>
<endEvent id="sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1"></endEvent>
<sequenceFlow id="sid-A74937CE-02B1-493B-8033-08CA2D652771" name="同意"
sourceRef="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0" targetRef="jlID">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='YES'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-BE2005E1-26F7-4E42-8AC2-7C4F25274F1A" name="同意"
sourceRef="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"
targetRef="sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='YES'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-67F146AA-C9F5-4A21-AF26-A77A349D80B7" name="拒绝"
sourceRef="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"
targetRef="sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='NO'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sid-4CC613DD-7789-408B-AFA0-1241261A4E79" name="拒绝"
sourceRef="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"
targetRef="sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${executeType=='NO'}]]></conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_MyLeave">
<bpmndi:BPMNPlane bpmnElement="MyLeave" id="BPMNPlane_MyLeave">
<bpmndi:BPMNShape bpmnElement="sid-159DD77D-9878-4288-AC29-B898E08DC216"
id="BPMNShape_sid-159DD77D-9878-4288-AC29-B898E08DC216">
<omgdc:Bounds height="30.0" width="30.0" x="45.0" y="105.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="zgID" id="BPMNShape_zgID">
<omgdc:Bounds height="80.0" width="100.0" x="165.0" y="80.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0"
id="BPMNShape_sid-A6E285DA-5C65-4BA7-8BB4-5F4D97AC12E0">
<omgdc:Bounds height="40.0" width="40.0" x="360.0" y="100.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB"
id="BPMNShape_sid-5BFB0FC6-B2A5-4F6E-9BDB-8785F2883AEB">
<omgdc:Bounds height="28.0" width="28.0" x="366.0" y="225.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="jlID" id="BPMNShape_jlID">
<omgdc:Bounds height="80.0" width="100.0" x="495.0" y="80.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF"
id="BPMNShape_sid-0DA07C30-2930-40F5-A887-FA1C5BF307EF">
<omgdc:Bounds height="40.0" width="40.0" x="690.0" y="100.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F"
id="BPMNShape_sid-8941849E-B17F-4848-BFC8-C6B05CC21A9F">
<omgdc:Bounds height="28.0" width="28.0" x="696.0" y="225.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1"
id="BPMNShape_sid-3596170A-0E0F-4C07-BD32-F04AFB375EB1">
<omgdc:Bounds height="28.0" width="28.0" x="825.0" y="106.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-1E8F84D7-6C11-4D88-84C9-B818474F880E"
id="BPMNEdge_sid-1E8F84D7-6C11-4D88-84C9-B818474F880E" flowable:sourceDockerX="15.0"
flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
<omgdi:waypoint x="74.94999923927439" y="120.0"></omgdi:waypoint>
<omgdi:waypoint x="164.99999999991007" y="120.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-08020782-2DDE-4C56-BFC0-224DC99FB50E"
id="BPMNEdge_sid-08020782-2DDE-4C56-BFC0-224DC99FB50E" flowable:sourceDockerX="50.0"
flowable:sourceDockerY="40.0" flowable:targetDockerX="20.5" flowable:targetDockerY="20.5">
<omgdi:waypoint x="264.9499999999992" y="120.1509063444109"></omgdi:waypoint>
<omgdi:waypoint x="360.43939393938865" y="120.43939393939392"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-4CC613DD-7789-408B-AFA0-1241261A4E79"
id="BPMNEdge_sid-4CC613DD-7789-408B-AFA0-1241261A4E79" flowable:sourceDockerX="20.5"
flowable:sourceDockerY="20.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
<omgdi:waypoint x="710.4194915254237" y="139.52220575783235"></omgdi:waypoint>
<omgdi:waypoint x="710.0588602435497" y="225.00012270930887"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-833DAA1C-F1C2-41A1-8455-3FAB79893C14"
id="BPMNEdge_sid-833DAA1C-F1C2-41A1-8455-3FAB79893C14" flowable:sourceDockerX="50.0"
flowable:sourceDockerY="40.0" flowable:targetDockerX="20.5" flowable:targetDockerY="20.5">
<omgdi:waypoint x="594.9499999999981" y="120.15090634441087"></omgdi:waypoint>
<omgdi:waypoint x="690.4393939393933" y="120.43939393939394"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-BE2005E1-26F7-4E42-8AC2-7C4F25274F1A"
id="BPMNEdge_sid-BE2005E1-26F7-4E42-8AC2-7C4F25274F1A" flowable:sourceDockerX="20.5"
flowable:sourceDockerY="20.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
<omgdi:waypoint x="729.516569086651" y="120.42578125"></omgdi:waypoint>
<omgdi:waypoint x="825.0001009915921" y="120.054279921789"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-67F146AA-C9F5-4A21-AF26-A77A349D80B7"
id="BPMNEdge_sid-67F146AA-C9F5-4A21-AF26-A77A349D80B7" flowable:sourceDockerX="20.5"
flowable:sourceDockerY="20.5" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
<omgdi:waypoint x="380.4194915254237" y="139.52220575783235"></omgdi:waypoint>
<omgdi:waypoint x="380.05886024354976" y="225.00012270930887"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-A74937CE-02B1-493B-8033-08CA2D652771"
id="BPMNEdge_sid-A74937CE-02B1-493B-8033-08CA2D652771" flowable:sourceDockerX="20.5"
flowable:sourceDockerY="20.5" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
<omgdi:waypoint x="399.50196526507943" y="120.44207317073172"></omgdi:waypoint>
<omgdi:waypoint x="494.9999999999935" y="120.15182370820669"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数