官方文档:https://tkjohn.github.io/flowable-userguide/#bpmnFirstExampleDiagram
乱翻一通,翻玩了一遍。好像什么都不懂。第二遍,寻找能让我理解的地方。
正文开始:
主要章节如图:
一下是自己的理解
文档流程如下
1.要解决的需求
用例很简单:有一个公司,叫做BPMCorp。在BPMCorp中,由会计部门负责,每月需要为投资人撰写一份报告。在报告完成后,需要高层经理中的一人进行审核,然后才能发给所有投资人
2.一个XML文件定义了流程。至于怎么定义,有工具。
<definitions id="definitions" targetNamespace="http://flowable.org/bpmn20" xmlns:flowable="http://flowable.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>
3.部署和启动流程实例(部署XML到工作流引擎)
我们只是得到了一个XML,和工作流引起并没有联系起来。得到的XML我们可以理解为流程定义(definition,感觉有点spring的感觉)。然后要得到流程实例,我们需要将这个XML(definition)部署。主要包括两步:
-
流程定义将会存储在Flowable引擎配置的持久化数据库中。因此部署业务流程保证了引擎在重启后也能找到流程定义。
-
BPMN 2.0流程XML会解析为内存中的对象模型,供Flowable API使用。
更多关于部署的信息可以在部署章节中找到。
部署代码:
Deployment deployment = repositoryService.createDeployment() .addClasspathResource("FinancialReportProcess.bpmn20.xml") .deploy();
然后我们就可以获得实例了:financialReport是xml中的id的值,在工作流中叫key
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");
官方给的一个demo:
public static void main(String[] args) { // 创建Flowable流程引擎 ProcessEngine processEngine = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration() .buildProcessEngine(); // 获取Flowable服务 RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); // 部署流程定义 repositoryService.createDeployment() .addClasspathResource("FinancialReportProcess.bpmn20.xml") .deploy(); // 启动流程实例 runtimeService.startProcessInstanceByKey("financialReport"); }
4.执行任务。
实例启动之后,所属第一个任务组accountancy成员都可以看到这个任务,如果其中一个人申领任务,任务组的其他成员就看不到了。
然后完成任务
taskService.complete(task.getId());
然后流程会到第二个任务,和第一个任务一样的处理。
完整代码:
这段代码考虑到了你可能已经使用Flowable UI应用启动了一些流程实例。代码中总是获取任务列表而不是一个任务
public class TenMinuteTutorial { public static void main(String[] args) { // 创建Flowable流程引擎 ProcessEngine processEngine = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration() .buildProcessEngine(); // 获取Flowable服务 RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); // 部署流程定义 repositoryService.createDeployment() .addClasspathResource("FinancialReportProcess.bpmn20.xml") .deploy(); // 启动流程实例 String procId = runtimeService.startProcessInstanceByKey("financialReport").getId(); // 获取第一个任务 TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list(); for (Task task : tasks) { System.out.println("Following task is available for accountancy group: " + task.getName()); // 申领任务 taskService.claim(task.getId(), "fozzie"); } // 验证Fozzie获取了任务 tasks = taskService.createTaskQuery().taskAssignee("fozzie").list(); for (Task task : tasks) { System.out.println("Task for fozzie: " + task.getName()); // 完成任务 taskService.complete(task.getId()); } System.out.println("Number of tasks for fozzie: " + taskService.createTaskQuery().taskAssignee("fozzie").count()); // 获取并申领第二个任务 tasks = taskService.createTaskQuery().taskCandidateGroup("management").list(); for (Task task : tasks) { System.out.println("Following task is available for management group: " + task.getName()); taskService.claim(task.getId(), "kermit"); } // 完成第二个任务并结束流程 for (Task task : tasks) { taskService.complete(task.getId()); } // 验证流程已经结束 HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult(); System.out.println("Process instance end time: " + historicProcessInstance.getEndTime()); } }
总结:
定义工作流(xml)-----》运行工作流实例(通过部署)------》启动工作流实例-----》执行任务(申领)-----》完成
后续:
可以看出这个业务流程太简单了,不能实际使用。但只要继续学习Flowable中可用的BPMN 2.0结构,就可以通过以下元素增强业务流程:
-
定义网关(gateway)使经理可以选择:驳回财务报告,并重新为会计师创建任务;或者接受报告。
-
定义并使用变量(variables)存储或引用报告,并可以在表单中显示它。
-
在流程结束处定义服务任务(service task),将报告发送给每一个投资人。
-
等等。