《Activiti/Flowable 深入BPM工作流》-流程實例怎麼實現掛起?
一. 問題
1. 什麼情況要進行流程的掛起?
2. 具體怎麼將流程掛起?
二. 詳情
1. 什麼情況要進行流程的掛起?
解答: 例如公司制度改變過程中的流程, 總經理更換過程中的流程
有100個人的流程, 70個人已經完成,30個人流程正好在總經理更換中,就需要掛起.
2. 具體怎麼將流程掛起?
解答: 先判斷流程是否暫停: 通過 processDifinition.isSuspended();
如果激活就掛起,否則不操作.
具體的代碼實現如下:
操作流程定義爲掛起狀態,該流程定義下邊所有的流程實例全部暫停:
流程定義爲掛起狀態該流程定義將不允許啓動新的流程實例,同時該流程定義下所有的流程實例將
全部掛起暫停執行。
1. 全部掛起
/**
* 掛起流程定義
*/
public void suspendOrActivateProcessDefinition() {
// 流程定義 id
String processDefinitionId = "";
// 獲得 RepositoryService
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine processEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
// 獲得流程定義
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
// 判斷是否暫停
boolean suspend = processDefinition.isSuspended();
if (suspend) {
// 如果暫停則激活,這裏將流程定義下的所有流程實例全部激活.
repositoryService.activateProcessDefinitionById(processDefinitionId, true, null);
System.out.println("流程定義:" + processDefinitionId + "已激活");
} else {
// 如果激活則掛起,這裏將流程定義的所有流程實例全部掛起
repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null);
System.out.println("流程定義: " + processDefinitionId + "掛起");
}
}
2. 單個掛起
操作流程實例對象,針對單個流程執行掛起操作,某個流程實例掛起則此流程不再繼續執行,完成
該流程實例的當前任務將報異常
/**
* 單個流程實例掛起
*/
@Test
public void suspendOrActivateProcessDefinitionOne() {
// 流程定義id
String processDefinitionId = "";
// 獲取runtimeService
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine processEngine = configuration.buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根據流程實例id查詢流程
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processDefinitionId(processDefinitionId).singleResult();
// 是否暫停
boolean suspend = processInstance.isSuspended();
if (suspend) {
// 如果暫停,則激活
runtimeService.activateProcessInstanceById(processDefinitionId);
System.out.println("流程實例: " + processDefinitionId + "激活");
} else {
// 如果激活則掛起
runtimeService.suspendProcessInstanceById(processDefinitionId);
System.out.println("流程實例:" + processDefinitionId + "掛起");
}
}
小結:
要實現流程的掛起,我們首先需要的是判斷流程是否存在,再暫停,通過 processDifinition.isSuspended(); 如果前面都存在,再進
行流程的掛起操作.
如果激活就掛起,否則不操作; 其中掛起也分爲單個掛起和批量掛起,這個就需要具體情況具體來分析了.