Flowable 流程实例
流程實例系列
RuntimeService 運行服務類
核心功能 啟動實例、查詢與實例相關的一些信息
是Flowable的流程執行服務類。可以從這個類中獲取很多關于流程執行相關的信息。
實現類為RuntimeServiceImpl
提供了一系列根據自身業務場景啟動流程實例的API
流程定義、執行實例、流程實例概念
流程定義類 可以從這里獲得資源文件。類似于java類
流程實例 代表流程定義的執行實例,比如張三請了一天假,他就必須發出一個流程實例的申請
一個流程實例包括了所有的運行節點。 我們可以用這個對象來了解當前流程實例的進度信息等
流程實例就表示一個流程從開始到結束的最大流程分支,即一個流程中流程實例只有一個。
流程實例通常也可以叫做執行實例的根節點
執行實例.
public interface ProcessInstance extends Execution
從源代碼中可以看出 ProcessInstance就是Execution
啟動流程的時候會首先創建流程實例,然后創鍵執行實例
流程運轉的過程中永遠執行的是自己對應的執行實例
當所有的執行實例按照規則執行完畢之后,這實例隨之結束
flowable用這個對象去描述流程執行的每一個節點
流程按照流程定義的規則執行一次的過程,就可以表示執行對象Execution
一個流程中,執行對象可以存在多個,但是流程實例只能有一個
執行實例的父級或者父級的父級為流程實例
執行實例可能會暫停到某一個活動節點,需要我們去通過特定的API去完成,然后執行實例繼續往下走
流程實例啟動
使用RuntimeService啟動流程實例
操作的是act_ru_execution表,如果是用戶任務節點,同時也會在act_ru_task添加一條記錄
/*** 部署流程*/ @Test public void deploy() {DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().category("leave").name("請假流程").addClasspathResource("leave.bpmn");//流程部署Deployment deploy = deploymentBuilder.deploy();System.out.println(deploy.getId()); }/*** 啟動流程實例 根據key*/ @Test public void startProcessInstanceByKey() {String processDefinitionKey = "leave";ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);System.out.println(processInstance.getId()+","+processInstance.getActivityId()); }查詢個人任務 TaskService(act_ru_task)
/*** 查詢個人任務*/@Test public void createTaskQuery() {String assignee = "張三";String processDefinitionKey = "leave";List<Task> list = taskService.createTaskQuery().taskAssignee(assignee).processDefinitionKey(processDefinitionKey).list();list.forEach(v -> System.out.println(v.getId() + " "+ v.getName() + " " + v.getTaskDefinitionKey()+ " " + v.getExecutionId() + " " + v.getProcessInstanceId() + " " + v.getCreateTime())); }從processEngine中應該得到TaskService
使用TaskService獲取到任務查詢對象TaskQuery
為查詢對象添加過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定用戶的待辦任務),同時可以添加分頁排序等過濾條件
調用list方法進行查詢
任務id、名稱、辦理人、創建時間可以從act_ru_task表中查到
完成個人任務
/*** 完成個人任務*/@Test public void completeTask() {String taskId = "20006";taskService.complete(taskId); }對于執行完的任務,Flowable將從act_ru_task表中刪除該任務,下一個任務會被插入進來(這兩個操作是在一個事物中)
查詢流程狀態
/*** 查詢流程實例狀態 判斷流程正在執行還是結束*/@Test public void createProcessInstanceQuery() {String processInstanceId = "30001";ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();if (processInstance != null) {System.out.println("當前流程實例正在運行");} else {System.out.println("當前流程實例正在運行");} }/*** 查詢執行實例狀態 判斷流程正在執行還是結束*/@Testpublic void createExecutionQuery() {List<Execution> list = runtimeService.createExecutionQuery().list();list.forEach(v-> System.out.println(v.getId()+","+v.getActivityId()));}歷史流程實例查詢historyService(act_hi_procinst)
HistoryService 用于查詢act_hi 開頭的表
歷史活動信息查詢 (act_hi_actinst)
歷史活動表 act_hi_actinst 活動節點的數據都會存儲在這個表中
/*** 查詢歷史活動節點* select RES.** FROM ACT_HI_ACTINST RES order by RES.ID_ asc;*/@Test public void createHistoricActivityInstanceQuery() {List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().list();list.forEach(v -> System.out.println(v.getId())); }歷史任務查詢(act_hi_taskinst)
/*** 查詢歷史任務* select distinct RES.** FROM ACT_HI_TASKINST RES order by RES.ID_ asc;*/@Test public void createHistoricTaskInstanceQuery() {List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().list();list.forEach(v -> System.out.println(v.getId())); }act_hi_taskinst表中的end_time有值,說明任務完成了。為空則任務還在運行,沒有結束
act_hi_taskinst表之后存儲任務節點的數據,其他節點的數據不會存儲在這個表中
流程實例涉及到的5張表
act_ru_execution:正在執行的信息
act_hi_procinst:已經執行完的歷史流程實例信息
act_hi_actinst:存放歷史所有完成的活動
act_ru_task: 正在執行的任務信息
act_hi_taskinst:已經執行完的歷史任務信息
流程發起人設置
?
/*** 設置流程實例的啟動人*/ @Test public void setAuthenticatedUserId() {String authenticatedUserId = "tyy";identityService.setAuthenticatedUserId(authenticatedUserId);String processDefinitionKey = "leave";ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);System.out.println(processInstance.getId() + "," + processInstance.getActivityId()); } /*** 設置流程實例的啟動人*/ @Test public void setAuthenticatedUserId2() {String authenticatedUserId = "tyy2";Authentication.setAuthenticatedUserId(authenticatedUserId);String processDefinitionKey = "leave";ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);System.out.println(processInstance.getId() + "," + processInstance.getActivityId()); }開始節點 initator 跟啟東人配合才有意義,否則沒有意義
dataObject使用 (act_ru_variable)
flowable允許開發人員在流程文檔中為流程或者子流程定義dataObject元素,該元素可以指定變量的id,名稱,數據類型等,支持的數據類型有string、boolean、datetime、double、int、long等。流程實例啟動時會將dataObject元素的信息自動轉換為流程實例變量的存在,變量名稱對應dataobject元素中定義的“name”值
/*** 獲取dataObject* select ** FROM ACT_RU_VARIABLE* WHERE EXECUTION_ID_ = '40001' and NAME_= '天數' and TASK_ID_ is null;*/ @Test public void getDataObject() {String executionId = "40001";String dataObject = "天數";DataObject dataObject1 = runtimeService.getDataObject(executionId, dataObject);if (dataObject1 != null) {System.out.println(dataObject1.getDataObjectDefinitionKey());System.out.println(dataObject1.getDescription());System.out.println(dataObject1.getExecutionId());System.out.println(dataObject1.getName());System.out.println(dataObject1.getValue());System.out.println(dataObject1.getType());}}/*** select ** FROM ACT_RU_VARIABLE* WHERE EXECUTION_ID_ = '40001' and TASK_ID_ is null;*/ @Test public void getDataObject2() {String executionId = "40001";Map<String, DataObject> dataObjects = runtimeService.getDataObjects(executionId);dataObjects.forEach((s, dataObject) -> {System.out.println(dataObject.getDataObjectDefinitionKey());System.out.println(dataObject.getDescription());System.out.println(dataObject.getExecutionId());System.out.println(dataObject.getName());System.out.println(dataObject.getValue());System.out.println(dataObject.getType());}); }流程實例刪除
?
/*** 流程實例刪除*/ @Test public void deleteProcessInstance() {String processInstanceId = "30001";String deleteReason = "測試刪除";runtimeService.deleteProcessInstance(processInstanceId, deleteReason);}/** *級聯刪除 */package com.webcreate.runtimeservicetest;import org.flowable.common.engine.impl.AbstractEngineConfiguration; import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;public class DeleteProcessInstanceIdCaCadeCmd implements Command<Void> {String processInstanceId = "";String deleteReason = "";public DeleteProcessInstanceIdCaCadeCmd(String processInstanceId, String deleteReason) {this.processInstanceId = processInstanceId;this.deleteReason = deleteReason;}@Overridepublic Void execute(CommandContext commandContext) {AbstractEngineConfiguration currentEngineConfiguration = commandContext.getCurrentEngineConfiguration();if (currentEngineConfiguration != null) {ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) currentEngineConfiguration;processEngineConfiguration.getExecutionEntityManager().deleteProcessInstance(processInstanceId, deleteReason, true);}return null;} }/*** 流程實例刪除 級聯刪除*/@Testpublic void deleteProcessInstance2() {String processInstanceId = "32501";String deleteReason = "測試刪除";managementService.executeCommand(new DeleteProcessInstanceIdCaCadeCmd(processInstanceId, deleteReason));}流程實例獲取運行的活動節點
/*** ### 流程實例獲取運行的活動節點*/ @Test public void getActiveActivityIds() {String executionId = "35004";List<String> activeActivityIds = runtimeService.getActiveActivityIds(executionId);activeActivityIds.forEach(v -> System.out.println(v)); }流程實例啟動
/*** ### 根據流程定義ID啟動流程*/ @Test public void startProcessInstanceById() {String processDefinitionId="dataobject:1:37504";runtimeService.startProcessInstanceById(processDefinitionId); } /*** 啟動流程實例 根據key*/ @Test public void startProcessInstanceByKey() {String processDefinitionKey = "leave";ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);System.out.println(processInstance.getId()+","+processInstance.getActivityId()); }流程實例的掛起與激活
/*** 判斷流程定義是否被掛起*/ @Test public void isProcessDefinitionSuspended() {String processDefinitionId = "leave:1:45004";boolean processDefinitionSuspended = repositoryService.isProcessDefinitionSuspended(processDefinitionId);System.out.println(processDefinitionSuspended); }/*** 流程定義掛起* SUSPENSION_STATE_ = 2 表示被掛起* SUSPENSION_STATE_ = 1 沒有被掛起*/ @Test public void suspendProcessDefinitionById() {String processDefinitionId = "leave:1:45004";repositoryService.suspendProcessDefinitionById(processDefinitionId); }/*** 流程定義激活*/ @Test public void activateProcessDefinitionById() {String processDefinitionId = "leave:1:45004";repositoryService.activateProcessDefinitionById(processDefinitionId); }/*** 流程定義掛起 同時掛起流程實例*/ @Test public void activateProcessDefinitionById2() {String processDefinitionId = "leave:1:45004";repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null); }通過runtimeService掛起流程實例
總結
以上是生活随笔為你收集整理的Flowable 流程实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米抢购神器-开放源码
- 下一篇: Modbus通信协议格式以及功能码