1 Flowable process engine允許我們創建ProcessEngine 對象和使用 Flowable 的API
ProcessEngine是線程安全的,他是通過 ProcessEngineConfiguration 進行創建的。ProcessEngineConfiguration 可以對 process engine 進行配置和微調。
ProcessEngineConfiguration 是通過 XML 配置文件或者通過編程方式進行創建,最少配置是配置好數據庫鏈接。例子如下
package org.flowable; import org.flowable.engine.ProcessEngine; import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration; public class HolidayRequest { public static void main(String[] args) { ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration() .setJdbcUrl("jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1") .setJdbcUsername("sa") .setJdbcPassword("") .setJdbcDriver("org.h2.Driver") .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); ProcessEngine processEngine = cfg.buildProcessEngine(); } }
說明:如果是spring環境,配置文件類 StandaloneProcessEngineConfiguration 可以替換成 SpringProcessEngineConfiguration 。
2 部署流程定義到 flowable engine,此時需要用到 RepositoryService ,RepositoryService 可以通過 processEngine 獲得。通過向 RepositoryService 傳遞流程定義文件來獲得部署對象。Deployment
部署流程意味着:
1)流程定義會持久化到數據庫中
2)BPMN 2.0 process XML 將會被解析成內存對象模型,該模型可以被 Flowable API 管理。
3 開始一個流程實例
到現在流程引擎中已經有了流程定義,開始流程實例之前需要一些流程變量,通過 RuntimeService 啟動一個流程實例。初始變量類型是 java.util.Map,向RuntimeService 對象傳遞初始數據,而變量的 key 和 流程定義文件 BPMN 2.0 XML 中的 id 相匹配。啟動一個流程實例代碼示例如下:
RuntimeService runtimeService = processEngine.getRuntimeService(); Map<String, Object> variables = new HashMap<String, Object>(); variables.put("employee", employee); variables.put("nrOfHolidays", nrOfHolidays); variables.put("description", description); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayRequest", variables);
RuntimeService 開啟一個流程是通過流程定義中的 ID ,在 Flowable 中稱作是key。
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
4 查詢和完成任務
當某一任務賦給一組人時,使用常量即可,如下:
<userTask id="approveTask" name="Approve or reject request" flowable:candidateGroups="managers"/>
當要賦給流程變量中的摸一個人時,使用格式如下
<userTask id="holidayApprovedTask" name="Holiday approved" flowable:assignee="${employee}"/>
4.1 當要查詢待辦任務時,需要使用 TaskService ,代碼示例如下:
TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list(); System.out.println("You have " + tasks.size() + " tasks:"); for (int i=0; i<tasks.size(); i++) { System.out.println((i+1) + ") " + tasks.get(i).getName()); }
4.2 編寫java自動化Service,在BPMN 2.0中稱之為 Service Task,在流程定義中代碼如下
<serviceTask id="externalSystemCall" name="Enter holidays in external system" flowable:class="org.flowable.CallExternalSystemDelegate"/>
其中代理類 CallExternalSystemDelegate 需要實現 org.flowable.engine.delegate.JavaDelegate 接口,此時,當流程到該任務時,會實例化該類並執行 execute 方法