赞
踩
将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完
工作流管理的实现带来的好处非常明显,包括提高企业经营的效率、提高企业资源的利用率,提高企业运作的灵活性和适应性、提高工作效率,关注核心业务,跟踪业务处理流程,量化业务处理效率,减少浪费,增加利润,充分利用现有计算机网络资源。工作流的实施将缩短企业的运营周期,改善内部(外部)流程,优化和合理使用资源,减少人为的错误和延误,提高劳动生产率。
JBPM (本文不做学习)
Activity
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准。
Activiti是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,同时促进Activiti BPM引擎和BPMN 2.0的匹配。作者:一名程序猿
链接:https://www.jianshu.com/p/972613558ba1
Flowable(activity的分支)
Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。这个章节将用一个可以在你自己的开发环境中使用的例子,逐步介绍各种概念与API。
Flowable可以十分灵活地加入你的应用/服务/构架。可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。 以JAR形式发布使Flowable可以轻易加入任何Java环境:Java SE;Tomcat、Jetty或Spring之类的servlet容器;JBoss或WebSphere之类的Java EE服务器,等等。 另外,也可以使用Flowable REST API进行HTTP调用。也有许多Flowable应用(Flowable Modeler, Flowable Admin, Flowable IDM 与 Flowable Task),提供了直接可用的UI示例,可以使用流程与任务。
Activity核心配置文件
spring: datasource: name: flow_activity url: jdbc:mysql://localhost:3306/${spring.datasource.name}?allowMultiQueries=true&useUnicode=true&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 #nullCatalogMeansCurrent=true 打开自动创建表文件 username: root password: 123456 # activiti default configuration activiti: database-schema-update: true check-process-definitions: true process-definition-location-prefix: classpath:/processes/ # 流程bpm.xml图存放位置 # process-definition-location-suffixes: # - **.bpmn # - **.bpmn20.xml history-level: full
流程引擎启动
public void givenBPMN_whenDeployProcess_thenDeployed() { //创建流程表——默认创建 processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); //部署流程 repositoryService.createDeployment() .addClasspathResource("processes/oa.bpmn20.xml") .deploy(); Long count = repositoryService.createProcessDefinitionQuery().count(); assertTrue(count >= 1); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
Activity核心数据表解析(具体可参照https://www.devdoc.cn/activiti-table-summary.html)
Activiti 使用到的表都是
ACT_
开头的。表名的第二部分用两个字母表明表的用途。
- ACT_RE_ (
RE
) 表示 repository 存储,包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。- ACT_RU_ (
RU
) 表示 runtime 运行时,运行时的流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。- ACT_HI_ (
HI
) 表示 history 历史数据表,包含着程执行的历史相关数据,如结束的流程实例,变量,任务,等等- ACT_ID_ (
ID
) 表示 identity 组织机构,用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。- ACT_GE_ (
GE
) 表示 general 全局通用数据及设置,各种情况都使用的数据。
Activity流程表
原文链接:https://blog.csdn.net/weixin_43075758/article/details/116264000
Activity核心架构
ProcessEngineConfiguration 流程引擎配置对象(配置数据库连接4个大配置和建表策略)
ProcessEngine 流程引擎核心对象(7大接口的入口类,流程总管)
七大接口(细节拆分,每个接口负责一部分)
1.RepositoryService:提供一系列管理流程部署和流程定义的API。
2.RuntimeService:在流程运行时对流程实例进行管理与控制。
3.TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务 等。
4.IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
5.ManagementService:提供对流程引擎进行管理和维护的服务。
6.HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
7.FormService:表单服务——读取自定义表单内容(activity动态表单–可通过事件进行操作,普通表单–可以绑定表单和外置表单)。详细可参照
RepositoryService
1.部署流程,查询流程定义和部署信息
2.挂起、激活流程定义
3.创建模型,获取部署的资源和流程图像
RuntimeService12(act_ru_execution–正在执行的流程对象、act_hi_procinst–流程实例的历史表、act_ru_task–存储的流程上正在运行的节点任务、act_hi_taskinst–历史任务实例表、act_hi_actinst–历史所有经过的活动)
RuntimeService功能
1.启动流程及对流程数据的控制。
2.流程实例【ProcessInstance】和执行流【Execution】查询。
3.触发流程操作、接受消息和信号。
RuntimeService启动流程及变量管理
- 启动流程的常用方式(id,key,message)
- 启动流程可选参数(businessKey,variables,tenantId)
- 变量(variables)的设置和获取
流程触发
- 使用trigger触发ReceiveTask节点
- 触发信号捕获事件signalEventReceived【全局触发信号】
- 触发消息捕获事件messageEventReceived【针对流程触发消息】
TaskService(ACT_RU_*)
TaskService的功能
- 对用户任务(UserTask)管理和流程控制
- 设置用户任务(UserTask)的权限信息(拥有者、候选人、办理人)
- 针对用户任务添加用户附件、任务评论和事件记录
TaskService对Task管理与流程控制
- Task对象的创建,删除
- 查询Task、并驱动Task节点完成执行
- Task相关参数变量(variable)设置
IdentityService(ACT_ID_*)
可以自定义数据表进行操作(暂不赘述)
ManagementService
*说明:很强很强详细参照
- 管理服务ManagementService
- 动态流程定义服务DynamicBpmnService(实际业务开发中很少用到)
两个场景
下一流程驳回就可以了,非要自己可以手动回退。
以后遇到这些问题一定要拒绝,工作流就应该在画图前确定好整个流程,违背流程的都应该学会拒绝。
HistoryService
管理历史流程信息
- 管理流程结束后的历史数据
- 构建历史数据的查询对象
- 根据流程实例ID删除流程历史数据
FormService
动态表单定义
<startEvent activiti:initiator="applyUserId" id="start" name="start"> <extensionElements> <activiti:formProperty datePattern="yyyy-MM-dd" id="startDate" name="请假开始日期" required="true" type="date"/> <activiti:formProperty datePattern="yyyy-MM-dd" id="endDate" name="请假结束日期" required="true" type="date"/> <activiti:formProperty id="reason" name="请假原因" required="true" type="string"/> </extensionElements> </startEvent> <userTask activiti:assignee="admin" activiti:exclusive="true" id="deptLeaderAudit" name="部门领导审批"> <extensionElements> <activiti:formProperty datePattern="yyyy-MM-dd" id="startDate" name="请假开始日期" type="date" writable="false"/> <activiti:formProperty datePattern="yyyy-MM-dd" id="endDate" name="请假结束日期" type="date" writable="false"/> <activiti:formProperty id="reason" name="请假原因" type="string" writable="false"/> <activiti:formProperty id="deptLeaderPass" name="审批意见" required="true" type="enum"> <activiti:value id="true" name="同意"/> <activiti:value id="false" name="不同意"/> </activiti:formProperty> </extensionElements> </userTask> ———————————————— 版权声明:本文为CSDN博主「jonathanzhan」的原创文章https://blog.csdn.net/whatlookingfor/article/details/52998861
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
普通表单
<startEvent id="begin" name="请假申请" activiti:initiator="applyUserId" activiti:formKey="/demo/leave/startForm"></startEvent> <userTask id="leaderAudit" name="部门经理审批" activiti:candidateGroups="test" activiti:formKey="/demo/leave/completeForm"></userTask>
- 1
- 2
Activity核心API
ProcessEngine
1 )在Activiti中最核心的类,其他的类都是由他而来。
2)产生方式。
FlowAble配置文件
spring: datasource: name: flow_flowable url: jdbc:mysql://localhost:3306/${spring.datasource.name}?allowMultiQueries=true&useUnicode=true&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 username: root password: 123456 # 工作流 Flowable 配置 flowable: # 1. false: 默认值,Flowable 启动时,对比数据库表中保存的版本,如果不匹配。将抛出异常 # 2. true: 启动时会对数据库中所有表进行更新操作,如果表存在,不做处理,反之,自动创建表 # 3. create_drop: 启动时自动创建表,关闭时自动删除表 # 4. drop_create: 启动时,删除旧表,再创建新表 database-schema-update: true # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化 db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置 check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程 history-level: full # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数
流程引擎启动方式
自动配置加载
/** * 流程引擎--创建28张表(操作一次即可) */ @Test void initProcessEngine1(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
手动配置加载
@Test void initProcessEngine2() { ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration() .setJdbcUrl("jdbc:mysql://localhost:3306/flow_flowable?allowMultiQueries=true&useUnicode=true&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true") .setJdbcUsername("root") .setJdbcPassword("123456") .setJdbcDriver("com.mysql.cj.jdbc.Driver") // 有了表后可以使用DB_SCHEMA_UPDATE_false .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); ProcessEngine processEngine = cfg.buildProcessEngine(); System.out.println("初始化Flowable——创建数据表"); processEngine = ProcessEngines.getDefaultProcessEngine(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/holiday.bpmn20.xml") .deploy(); //查询部署成功的流程 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .deploymentId(deployment.getId()) .singleResult(); System.out.println("Found process definition : " + processDefinition.getName()); Map<String, Object> variables = new HashMap<String, Object>(); variables.put("employee", "校长"); variables.put("nrOfHolidays", 11); variables.put("description", "请假"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday",variables); System.out.println("启动流程实例成功"); }*
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
Flowable核心数据表(跟activity类似)
ACT_RE_: 'RE’代表repository
。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。
ACT_RU_: 'RU’代表runtime
。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。
ACT_HI_*: 'HI’代表history
。这些表存储历史数据,例如已完成的流程实例、变量、任务等。
ACT_GE_***: 通用数据。在多处使用。
ACT_CMMN_*:CMMN的整合表
ACT_APP_*:数据流压缩包通过http请求发布到task模块
ACT_DMN_*:决策表数据
数据表详情链接:https://blog.csdn.net/qq_42277412/article/details/121830797
Flowable核心架构
ProcessEngineConfiguration 流程引擎配置对象(配置数据库连接4个大配置和建表策略)
ProcessEngine 流程引擎核心对象(7大接口的入口类,流程总管),ProcessEngine与服务对象都是线程安全的,因此可以在服务器中保存并共用同一个引用。
七大接口(细节拆分,每个接口负责一部分)
RepositoryService:很可能是使用Flowable引擎要用的第一个服务。这个服务提供了管理与控制
部署(deployments)
与流程定义(process definitions)
的操作。这个服务还可以:
- 查询引擎现有的部署与流程定义。
- 暂停或激活部署中的某些流程,或整个部署。暂停意味着不能再对它进行操作,激活刚好相反,重新使它可以操作。
- 获取各种资源,比如部署中保存的文件,或者引擎自动生成的流程图。
- 获取POJO版本的流程定义。它可以用Java而不是XML的方式查看流程。
RuntimeService:用于启动流程定义的新流程实例。同一时刻,一个流程定义通常有多个运行中的实例。
RuntimeService
也用于读取与存储流程变量
。流程变量是流程实例中的数据,可以在流程的许多地方使用(例如排他网关经常使用流程变量判断流程下一步要走的路径)。RuntimeService
还可以用于查询流程实例与执行(Execution)。执行也就是BPMN 2.0中'token'
的概念。通常执行是指向流程实例当前位置的指针。最后,还可以在流程实例等待外部触发时使用RuntimeService
,使流程可以继续运行。流程有许多等待状态(wait states)
,RuntimeService
服务提供了许多操作用于“通知”流程实例:已经接收到外部触发,流程实例可以继续运行。TaskService:
- 查询分派给用户或组的任务
- 创建*独立运行(standalone)*任务。这是一种没有关联到流程实例的任务。
- 决定任务的执行用户(assignee),或者将用户通过某种方式与任务关联。
- 认领(claim)与完成(complete)任务。认领是指某人决定成为任务的执行用户,也即他将会完成这个任务。完成任务是指“做这个任务要求的工作”,通常是填写某个表单。
IdentityService:很简单。它用于管理(创建,更新,删除,查询……)组与用户。请注意,Flowable实际上在运行时并不做任何用户检查。例如任务可以分派给任何用户,而引擎并不会验证系统中是否存在该用户。这是因为Flowable有时要与LDAP、Active Directory等服务结合使用。
FormService:可选服务。也就是说Flowable没有它也能很好地运行,而不必牺牲任何功能。这个服务引入了开始表单(start form)与任务表单(task form)的概念。 开始表单是在流程实例启动前显示的表单,而任务表单是用户完成任务时显示的表单。Flowable可以在BPMN 2.0流程定义中定义这些表单。表单服务通过简单的方式暴露这些数据。再次重申,表单不一定要嵌入流程定义,因此这个服务是可选的。
HistoryService:暴露Flowable引擎收集的所有历史数据。当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。这个服务主要提供查询这些数据的能力。
ManagementService:通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。Flowable中很多地方都使用
作业,例如定时器(timer),异步操作(asynchronous continuation),延时暂停/激活(delayed suspension/activation)等等。后续会详细介绍这些内容。
DynamicBpmnService:可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。
例如:有一个任务 可能需要多人审批,审批通过的条件可能比较多样,比如五个人审批。3个人审批过了就算过了,再或者有一个人权限比较高,拥有一票否决权。 即是其余所有人都过了点了,boss点了个否定就算不过了,这种就是会签。即多人审批节点设计。
loopCardinality(循环基数) 设置审批实例,可以理解有多少人审批当前节点
flowable:assignee="${assignee}"单个审批人或多个
flowable:collection=“assigneeList”集合类型审批人
flowable:elementVariable=“assignee”审批人单元
isSequential=“false” 定义串行并行审批(false并行多个人同时收到审批任务、true串行,串行一个个来审批)
completionCondition 定义审批完成条件
${nrOfCompletedInstances/nrOfInstances>0.5}
nrOfCompletedInstances/nrOfInstances = 完成任务实例数
nrOfInstances=总实例数
nrOfCompletedInstances/nrOfInstances>0.5 超过50%通过节点审批完成
思路:具体操作TaskService 和TaskExtMapper接口进行节点遍历回退。
参考javadocs了解服务操作与引擎API的更多信息。
流程实例与执行流概念:在Activiti中,启动了一个流程,会创建一个流程实例(Processlnstance),每个流程实例至少会有一个执行流(Execution) 。当流程实例没有流程分支时,一般情况下只会存在一个执行流;假设流程出现两个分支,此时Activiti将会有三个执行流,第一个为原来流程的主执行流,而其余两个为子执行流。 ↩︎
流程实例和执行流对象:Processlnstance是一个接口,一个Processlnstance实例表示一个流程实例,Processlnstance实际上是执行流(Execution)的子接口,流程实例也是一个执行流。Processlnstance中有Execution没有的属性,例如流程定义和业务主键。当得到的是一个Processlnstance实例时,就将其看作一个流程实例;当得到一个Execution实例时,它就是一个执行流。流程实例与执行流的数据保存在执行表ACT_RU_EXECUTION中,对应的映射实体为ExecutionEntitylmpl。 ↩︎
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。