1 什么是流程實例?
- 參與者(可以是用戶也可以是程序)按照流程定義內容發起一個流程,這就是一個流程實例。是動態的。
- 以下是流程定義和流程實例的圖解:

2 啟動流程實例
- 流程定義部署在Activiti中后,就可以在系統中通過Activiti去管理該流程的執行,執行流程表示流程的一次執行。比如部署系統請假流程后,如果某個用戶要申請請假這個時候就需要執行這個流程,如果另外一個用戶也要申請請假則也需要執行該流程,每個執行互不影響,每個執行是單獨的流程實例。
- 執行流程首先需要啟動流程實例:
package com.sunxiaping;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-01 21:13
*/
public class ActivitiStartProcessInstanceTest {
/**
* act_hi_actinst 活動實例
* act_hi_identitylink 參與者信息
* act_hi_procinst 流程實例
* act_hi_taskinst 任務實例
* act_ru_execution 執行表
* act_ru_identitylink 參與者信息
* act_ru_task 任務表
*/
@Test
public void test() {
//創建ProcessEngineConfiguration對象
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
ProcessEngine processEngine = configuration.buildProcessEngine();
//獲取RuntimeService對象
RuntimeService runtimeService = processEngine.getRuntimeService();
//根據流程定義的key啟動流程實例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday");
//獲取流程實例的相關信息
String processDefinitionId = processInstance.getProcessDefinitionId();
System.out.println("流程定義的id = " + processDefinitionId);
String deploymentId = processInstance.getDeploymentId();
System.out.println("流程部署的id = " + deploymentId);
String id = processInstance.getId();
System.out.println("流程實例的id = " + id);
String activityId = processInstance.getActivityId();
System.out.println("當前活動的id = " + activityId);
}
}
3 BusinessKey(業務標識)
-
啟動流程實例時,指定的businessKey,就會在act_run_execution表中存儲businessKey。
-
BusinessKey:業務標識,通常為業務表的主鍵,業務標識和流程實例一一對應。業務標識來源於業務系統。存儲業務標識就是根據業務標識來關聯查詢業務系統的數據。比如:請假流程啟動一個流程實例,就可以將請假單的id作為業務標識存儲到Activiti中,將來查詢Activiti的流程實例信息就可以獲取請假單的id從而關聯查詢業務系統數據庫得到請假單信息。
-
示例:
package com.sunxiaping;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-01 21:13
*/
public class ActivitiBusinessKeyTest {
@Test
public void test() {
String processDefinitionKey = "holiday";
String businessKey = "1";
//創建ProcessEngineConfiguration對象
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
ProcessEngine processEngine = configuration.buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey);
String businessKeyDb = processInstance.getBusinessKey();
System.out.println("businessKeyDb = " + businessKeyDb);
}
}
4 查詢流程實例(關聯businessKey)
-
需求:
- 在Activiti實際應用時,查詢流程實例列表時可能要顯示出業務系統的一些相關信息,比如:查詢當前運行的請假流程列表需要將請假單名稱、請假天數等信息顯示出來,請假天數等信息在業務系統中存在,而並沒有在Activiti數據庫中存在,所以是無法通過Activiti的API查詢到請假天數等信息。
-
實現:
- 在查詢流程實例的時候,通過businessKey(業務標識)關聯查詢業務系統的請假單表,查詢出請假天數等信息。
- 通過下面的代碼就可以獲取到Activiti中所對應實例保存的key。而這個業務key一般都會保存相關聯的業務操作表的主鍵,再通過主鍵id去查詢業務信息,比如通過請假單的id,去查詢更多的請假信息(請假人、請假時間、請假天數、請假事由等)。
String businessKeyDb = processInstance.getBusinessKey();
5 流程實例掛起和激活
5.1 概述
- 某些情況可能由於流程變更需要將當前運行的流程暫停而不是直接刪除,流程暫停后將不會繼續執行。
5.2全部流程實例掛起和激活
-
操作流程定義為掛起狀態,該操作定義下面的所有的流程實例將全部暫停。
-
流程定義為掛起狀態,該流程定義下將不允許啟動新的流程實例,同時該流程定義下的所有流程實例將全部掛起暫停執行。
-
示例:
package com.sunxiaping;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-03 20:02
*/
public class ActivitiAllProcessSuspendActivateTest {
@Test
public void test() {
//獲取ProcessEngineConfiguration對象
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
//獲取ProcessEngine對象
ProcessEngine processEngine = configuration.buildProcessEngine();
//獲取RepositoryService對象
RepositoryService repositoryService = processEngine.getRepositoryService();
//獲取指定key的流程定義
List<ProcessDefinition> processDefinitionList = repositoryService.createProcessDefinitionQuery().processDefinitionKey("holiday").list();
for (ProcessDefinition processDefinition : processDefinitionList) {
//如果該流程定義是暫停的
boolean suspended = processDefinition.isSuspended();
if (suspended) {
//如果該流程定義是暫停的,則激活該流程定義下的所有流程實例
//第一個參數,表示流程定義的id
//第二個參數,表示是否級聯激活該流程定義的流程實例
//第三個參數,表示激活這個流程定義的時間,如果不填寫,從此刻開始
repositoryService.activateProcessDefinitionById(processDefinition.getId(), true, null);
System.out.println("流程定義" + processDefinition.getId() + "激活");
} else {
//如果該流程定義是激活的,則掛起該流程定義
repositoryService.suspendProcessDefinitionById(processDefinition.getId(), true, null);
System.out.println("流程定義" + processDefinition.getId() + "掛起");
}
}
}
}

5.3 單個流程實例掛起和激活
-
操作流程實例對象,針對單個流程執行掛起操作,某個流程實例掛起則此流程不再執行,完成該流程實例的當前任務將報異常。
-
示例:
package com.sunxiaping;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
import java.util.List;
/**
* @author <a href="mailto:1900919313@qq.com">weiwei.xu</a>
* @version 1.0
* 2020-08-03 20:02
*/
public class ActivitiSingleProcessSuspendActivateTest {
@Test
public void test() {
String processInstanceId = "2501";
//獲取ProcessEngineConfiguration對象
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");
//獲取ProcessEngine對象
ProcessEngine processEngine = configuration.buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).list();
for (ProcessInstance processInstance : processInstanceList) {
boolean suspended = processInstance.isSuspended();
if (suspended) {
runtimeService.activateProcessInstanceById(processInstance.getProcessInstanceId());
System.out.println("流程實例" + processInstance.getProcessDefinitionId() + "激活");
} else {
runtimeService.suspendProcessInstanceById(processInstance.getProcessInstanceId());
System.out.println("流程實例" + processInstance.getProcessDefinitionId() + "掛起");
}
}
}
}

