标签:seq alt roc 办理 var 独立 定义 return 构建
Flowable 中文文档网址:http://www.shareniu.com/flowable6.5_zh_document/bpm/index.html
2.1 Flowable是什么?
Flowable--定义:使用Java编写的轻量级业务流程引擎。
工作流引擎:指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。
工作流引擎功能包括流程的节点管理、流向管理、流程样例管理....重要功能
工作流简介https://blog.csdn.net/shankaipingo/article/details/1387615
业务流程引擎:
流程定义主要包括两个文件:bpmn文件和流程图片
Flowable--功能:1.部署BPMN 2.0流程定义
2.创建流程定义的流程实例
3.查询/访问运行中(或历史)的流程实例及相关数据
Flowable--优点:1.可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。
2.可以使用Flowable REST API进行HTTP调用
3.提供了可使用简单方便的UI的Flowable应用
2.2 Flowable 是activiti的fork
activiti是一个著名的工作流引擎(一个工作审批流)。Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),可以定义流程、执行流程并以不同方式对其实现运行。
activiti运行后生成的一些表:
关于activiti提供的服务:
1:RepositoryService:Activiti仓库服务类,管理流程定义。(仓库中存储流程定义的两个文件:bpmn文件和流程图片)
2:RuntimeService:Activiti流程执行服务类,执行(启动/推进/删除...流程实例)管理
3:TaskService:Activiti任务服务类,跟踪UserTasks,可以使用此服务创建任务、声明并完成任务,分配任务等。
4:HistoryService:Activiti查询历史信息类
5:IdentityService:组织机构,管理用户和组
6:FormService:可选,用于定义中开始表单和任务表单
2.3 构建命令行程序
2.3.1 创建流程引擎
创建一个Flowable流程引擎,使用maven获取Flowable依赖及管理构建。
maven基于项目对象模型(POM),通过对pom.xml文件配置,来管理项目构建,报告和文档的软件项目管理工具。
maven--合理叙述项目间依赖关系
maven的详细介绍:https://blog.csdn.net/weixin_33853827/article/details/85910940?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
流程引擎创建:
1、添加flowable流程引擎和h2数据库两个依赖。pom文件中添加flowable流程引擎依赖时,需要将版本号修改为6.5.0
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-engine</artifactId>
<version>6.5.0</version>
</dependency>
2、在java的main方法中,创建一个流程引擎
初始化流程配置--创建流程引擎
main():ProcessEngine processEngine=creatProcessEngine(creatProcessEngineConfiguration());
(1)初始化流程配置:使用ProcessEngineConfiguration实例创建一个独立(standlone)的processEngine,所需要的最小配置,是数据库JDBC连接传递参数
--->ProcessEngineConfiguration实例作用:配置与调整流程引擎的设置
--->独立(standlone)配置对象,?引擎完全独立创建及使用【不是在Spring环境中使用,若在Spring环境中,需要使用SpringProcessEngineConfiguration类】
(2)这个配置创建ProcessEngine对象
/**
* 创建流程引擎实例
* @param cfg
* @return
*/
public static ProcessEngine creatProcessEngineConfiguration (ProcessEngineConfiguration cfg) {
return cfg.buildProcessEngine();
}
2.3.2 部署流程定义
步骤:流程定义建立(该节采用直接编写BPMN2.0 的xml文件方式,其余方式见下)-部署(deploy)
1、流程定义的建立:在src/main/resources文件夹下写一个holiday-request.bpmn20.xml文件【xml文件具体内容见官网http://www.shareniu.com/flowable6.5_zh_document/bpm/index.html#_deploying_a_process_definition】
一些概念:
*流程定义(process definition):重复执行流程的蓝图
*流程实例(process instance):某个角色提出的一个流程
*流程定义需要是BPMN2.0格式,一个流程定义可以启动多个流程实例。例如:请假流程中:流程定义--请假的各个步骤;流程实例--某个雇员提出的一个请假申请
*BPMN格式存储是一个XML,可以可视化;
*流程定义建立:使用可视化建模工具,eg:Flowable Designer(Eclipse)或Flowable Web Modeler(Web应用)
官网入门用户手册中流程定义的建立使用方式:直接撰写XML--在src/main/resources文件夹下写一个holiday-request.bpmn20.xml文件
所建立的流程定义---请假流程:(流程具体解释见用户手册)
掌握几个概念:start event--user task--exclusive gateway
圆圈:启动事件
第一个矩形:用户任务,人类用户操作的步骤
带叉菱形:排他网关
holiday-request.bpmn20.xml文件中需掌握的几个概念:
活动(activity)--流程中的每一个步骤;每一个活动都有一个id属性,也可设置一个名字,提高流程图可读性
顺序流(sequence flow)--一个有向箭头,用于连接活动
表达式条件(conditionExpression)--在排他网关中使用,当执行到排它网关时,计算表达式条件,使用第一个计算为true的顺序流
流程变量(process variable)--条件表达式中的变量“approved”.流程变量是持久化数据。在特定步骤时设置这个变量,不是流程实例启动时就可以得到的数值
执行(execution)
2、部署【将建立好的流程定义部署到Flowable引擎中】
掌握部署流程含义:部署一个流程定义
?流程引擎会将XML文件存储在数据库中,在有需要的时候获取它。
?流程定义转换为内部的、可执行的对象模型,使用它就可以启动流程实例。
步骤:根据xml文件路径的方式在仓库中创建一个新的部署-->执行deploy()部署
从流程引擎对象processEngine对象得到一个仓库服务类(RepositoryService)----使用creatDeployment()在仓库中创建一个部署---使用deploy()方法部署该流程定义(
BPMN2.0.xml)
/**
* 将流程定义对象,部署到流程引擎的仓库中。
* @param processEngine
* @param bpmnFiles
* @return
*/
public static Deployment deployFlowableXML(ProcessEngine processEngine,String bpmnFiles) {
return repositoryService(processEngine).createDeployment().addClasspathResource(bpmnFiles).deploy();
}
3、使用API查询流程定义是否已经部署在flowable引擎中--通过RepositoryService创建的ProcessDefinitionQuery对象实现
2.3.3 启动流程实例
根据在流程引擎中部署好的流程定义,启动一个流程实例。
步骤:初始化流程变量--------RuntimeService启动流程实例
启动流程实例,需要提供一些初始化流程变量(process variable)【呈现给用户的表单/其他系统自动触发流程时通过REST API获取】
REST:Representational State Transfer 资源表述性转移。REST API介绍:https://blog.csdn.net/champaignwolf/article/details/84099258
(1)在这部分使用scanner类命令行输入的数据作为初始化的流程变量。
(2)使用Map实例传输数据[Key--用于获取变量的标识符--BPMN2.0 XML文件中id属性]
(3)使用runtimeservice.startProcessInstanceByKey("holidayRequest", variables)启动流程实例
2.3.4 事务
1、数据库事务概念:一个数据库事务通常包含了一个序列的对数据库的读/写操作
2、数据库事务存在目的:
(1)为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即时在异常状态仍能保持一致性的方法
(2)当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
在Flowable中,当一个流程实例运行时,总会有一个数据库事务从前一个等待状态持续到下一个等待状态。引擎到达等待状态的用户任务后,状态持久化到数据库,提交事务,并返回API调用处
疑问???:每次用户任务完成时都会启动一个新的数据库事务?还是一个流程实例只有一个数据库事务??
2.3.5 查询与完成任务
本小节功能:查询有几个任务并查看任务列表+任务的完成
实际应用中,会给角色(雇员/经理)提供登录可查看的任务列表,并决定如何操作任务。本部分通过执行API调用--模拟任务列表
步骤:【查询】:为用户任务指派办理人,获得任务列表+【完成】
1、【查询】:获得任务列表-->使用TaskService创建的一个TaskQuery,查询只返回的是‘managers’组的任务
Note:(1)List导入的包是:import java.util.List;(2)task 导入的包是:import org.flowable.task.api.Task;
结果:
2、【完成任务】:经理完成任务。--流程变量(process variable)的传递,实现:--带有‘approved’变量的map模拟
//经理完成任务,使用带有变量‘approved’的map模拟
boolean approved=scanner.nextLine().toLowerCase().equals("y");
variables = new HashMap<String,Object>();
variables.put("approved", approved);
taskService.complete(task.getId(), variables);
?输入Yes/no后报错;
原因:没有实现申请通过后执行的自动逻辑---【解决方案】:第2.3.6节实现JavaDelegate
2.3.6 实现JavaDelegate
解释:在之前的代码中,没有实现申请通过后执行的自动逻辑,即服务任务(service task)【图形结构中带‘设置’图标的那些任务】。BPMN 20.xml文件下有引用类CallExternalSystemDelegate,而我们的项目中目前还没有这个类
步骤:在org.flowable包下创建CallExternalSystemDelegate类,继承JavaDelegate接口,实现execute()方法
公共接口JavaDelegate:
需要BPMN 2.0流程中的Java委派时应使用的便捷类(例如,调用自定义业务逻辑)。该类可用于服务任务和事件侦听器。该类不允许影响控制流。它遵循默认的BPMN 2.0行为,即获取每个输出序列流(如果定义了条件,则条件为true)。如果您需要影响控制流,需使用类‘org.flowable.engine .impl.pvm.delegate.ActivityBehavior‘代替。
在该公共接口下,有一个execute()方法。
2.3.7 使用历史数据--HistoryService
Flowable功能:自动存储所有流程实例的审计数据或历史数据
步骤:使用引擎获取HistoryService--创建历史活动实例查询(添加过滤条件)
添加过滤条件:processInstanceId(processInstance.getId()).finished().orderByHistoricActivityInstanceEndTime().asc().list()
processInstanceId():仅选择具有给定流程实例的历史活动实例,ID与HistoricProcessInstanceID匹配
finished():仅选择已经完成的历史活动实例
orderByHistoricActivityInstanceEndTime():按照结束时间排序,需要后跟asc()或desc()
掌握HistoryService使用,getDurationInMillis()方法使用
运行结果:
2.3.8 小结
1、ProcessEngineConfiguration--可以从中构建流程引擎的配置信息;
创建processEngine配置对象cfg,使用buildProcessEngine()方法,创建processEngine对象。
2、ReposityService:提供对流程定义和部署仓库的访问的服务。
(1)可用于将流程定义部署到流程引擎。使用creatDeployment()[创建一个新的部署]--deploy()方法
3、ProcessDefinition:一个对象结构,表示由活动和过渡组成的可执行流程。业务流程通常使用图形编辑器创建,这些图形编辑器以某种文件格式存储流程定义。这些文件可以添加到Deployment控件,eg:Business Archive(.bar)文件。在部署时,引擎会将流程定义文件解析为此类的可执行实例。可用于启动一个流程实例
(2)查询流程定义是否在流程引擎。使用repositoryService(processEngine).createProcessDefinitionQuery()[查询流程定义]
4、RuntimeService:
启动流程实例。 使用runtimeService.
startProcessInstanceByKey()方法:Starts a new process instance in the latest version of the process definition with the given key
5、TaskService:提供访问任务和表单相关的服务。
获得任务列表:TaskService创建一个TaskQuery.
createTaskQuery()--返回一个新的TaskQuery,可用于动态查询任务。
6、HistoryService:提供正在进行或过去的流程实例的信息的服务。这与运行时信息有所不同,因为该运行时信息在任何给定时刻仅包含实际运行时状态,并且针对运行时过程执行性能进行了优化。历史记录信息经过优化,易于查询,并在永久性存储中永久保留。
creatHistoricActivityInstanceQuery():创建一个新的程序化查询来搜索HistoricActivityInstances。
标签:seq alt roc 办理 var 独立 定义 return 构建
原文地址:https://www.cnblogs.com/KellyW-Li/p/12879059.html