官方文檔: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),將報告發送給每一個投資人。
-
等等。