一、什么是工作流
我们先看下维基百科的定义:
BPM, Business Process Management, workflow,是由一种协调的、可重复的活动模式组成,通过将资源系统化地组织为转换材料、提供服务或过程信息的过程来实现。它可以描述为一系列操作、个人或团队的工作、员工组织的工作,或一个或多个简单或复杂的机制。
感觉比较抽象,再具体点就是是对企业的审批业务流程的一个抽象,比如常见的 OA 中的审批业务:任务审批、请假审批等等,核心主体有操作或者任务以及对应的责任人或团体。
二、Activiti
提供了工作流的实现,类似于一个完整的项目,会自动创建表, 并以 listener 对外暴露事件接口,xxxService 提供 API。
核心类图:
- RepositoryService : 流程定义, 一个流程的定义对应多个运行中流程实例
- RuntimeService: 获取流程运行中信息,以及流程等待外部触发,启动一个流程实例
- TaskService: 获取分配给真实人的任务,创建任务,分配任务给具体的人
- IdentityService:对用户和组的CRUD
- FormService : 可选, 提供开始流程前的开始表单,以及完成任务的任务表单
- HistoryService: 暴露所有流程运行时产生的历史数据
- ManagementService :获取所有的表信息和元数据
Activiti 流程定义
一个流程的定义有固定的要素:
startEvent->UserTask1 -> UserTask2-> ... -> endEvent
比如企业财报:财务做财报,财务主管审批后,交给股东查看。
流程图如下:
具体流程步骤:
-
开始:定义流程的入口
-
依次定义用户任务:第一个任务分配给财务部,第二个任务分配给管理部
-
结束。
以上所有的元素需要通过 sequence flow (source 指定源,target 指定目的,确定方向)相互连接起来。
<definitions id="definitions"
targetNamespace="http://activiti.org/bpmn20"
xmlns:activiti="http://activiti.org/bpmn"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
<process id="financialReport" name="Monthly financial report reminder process">
<startEvent id="theStart" />
<sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportTask' />
<userTask id="writeReportTask" name="Write monthly financial report" >
<documentation>
Write monthly financial report for publication to shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>accountancy</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id='flow2' sourceRef='writeReportTask' targetRef='verifyReportTask' />
<userTask id="verifyReportTask" name="Verify monthly financial report" >
<documentation>
Verify monthly financial report composed by the accountancy department.
This financial report is going to be sent to all the company shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>management</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlow id='flow3' sourceRef='verifyReportTask' targetRef='theEnd' />
<endEvent id="theEnd" />
</process>
</definitions>
三、Activiti 使用步骤
1. 定义流程
2. 部署流程: 存储流程定义文件、加载到内存方便api操作
3. 启动一个流程实例:流程启动后会进入startEvent,自动进入UserTask 并等待,同时状态会记录到数据库,如果 activiti 重启或奔溃数据不会丢失
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("FinancialReportProcess.bpmn20.xml")
.deploy();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");
显示开发过程中,整体的流程如下:
四、总结
1. 流程需要先定义后使用;
2. 流程启动后,会创建一个流程实例,并且进入第一个用户任务;
3. 任务完成后(调用完成命令)会自动删除;
如果觉得还不错的话,关注、分享、在看(关注不失联~), 原创不易,且看且珍惜~