Activiti的流程實例及掛起激活(七)


1.1什么是流程實例


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

1.2啟動流程實例


流程定義部署在 activiti 后,就可以在系統中通過 activiti 去管理該流程的執行,執行流程表示流
程的一次執行。比如部署系統請假流程后,如果某用戶要申請請假這時就需要執行這個流程,如果
另外一個用戶也要申請請假則也需要執行該流程,每個執行互不影響,每個執行是單獨的流程實例

執行流程首先需要啟動流程實例。

@Test
public void startProcessInstance() {
// 流程定義key
String processDefinitionKey = "";
// 獲取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 根據流程定義key啟動流程
ProcessInstance processInstance = runtimeServic.startProcessInstanceByKey(processDefinitionKey);
System.out.println(" 流 程 定 義 id : " +
processInstance.getProcessDefinitionId());
System.out.println("流程實例id: " + processInstance.getId());
System.out.println("當前活動Id: " + processInstance.getActivityId());
}

1.3Businesskey(業務標識)

啟動流程實例時,指定的businesskey,就會在act_ru_execution #流程實例的執行表中存儲businesskey
Businesskey:業務標識,通常為業務表的主鍵,業務標識和流程實例一一對應。業務標識來源於業
務系統。存儲業務標識就是根據業務標識來關聯查詢業務系統的數據。
比如: 請假流程啟動一個流程實例,就可以將請假單的 id 作為業務標識存儲到 activiti 中,將來查詢
activiti 的流程實例信息就可以獲取請假單的 id 從而關聯查詢業務系統數據庫得到請假單信息。

/**
 *  啟動流程實例,添加進businessKey
 *
 *  本質:act_ru_execution表中的businessKey的字段要存入業務標識
 */
public class BusinessKeyAdd {


    public static void main(String[] args) {
        //1.得到ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RuntimeService對象
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //3.啟動流程實例,同時還要指定業務標識businessKey  它本身就是請假單的id
        //第一個參數:是指流程定義key
        //第二個參數:業務標識businessKey
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday", "1001");

        //4.輸出processInstance相關的屬性,取出businessKey使用:processInstance.getBusinessKey()
        System.out.println(processInstance.getBusinessKey());

    }
}

 

 1.4操作數據庫表

啟動流程實例,操作如下數據庫表:
SELECT * FROM act_ru_execution #流程實例執行表,記錄當前流程實例的執行情況

說明:
流程實例執行,如果當前只有一個分支時,一個流程實例只有一條記錄且執行表的主鍵 id 和流程實
id 相同,如果當前有多個分支正在運行則該執行表中有多條記錄,存在執行表的主鍵和流程實例
id 不相同的記錄。 不論當前有幾個分支總會有一條記錄的執行表的主鍵和流程實例 id 相同
一個流程實例運行完成,此表中與流程實例相關的記錄刪除。
SELECT * FROM act_ru_task #任務執行表,記錄當前執行的任務

說明:啟動流程實例,流程當前執行到第一個任務結點,此表會插入一條記錄表示當前任務的執行

情況,如果任務完成則記錄刪除。
SELECT * FROM act_ru_identitylink #任務參與者,記錄當前參與任務的用戶或組

SELECT * FROM act_hi_procinst #流程實例歷史表

流程實例啟動,會在此表插入一條記錄,流程實例運行完成記錄也不會刪除。
SELECT * FROM act_hi_taskinst #任務歷史表,記錄所有任務


開始一個任務,不僅在 act_ru_task 表插入記錄,也會在歷史任務表插入一條記錄,任務歷史表的主
鍵就是任務 id,任務完成此表記錄不刪除。
SELECT * FROM act_hi_actinst #活動歷史表,記錄所有活動

活動包括任務,所以此表中不僅記錄了任務,還記錄了流程執行過程的其它活動,比如開始事件、
結束事件

 1.5查詢流程實例
流程在運行過程中可以查詢流程實例的狀態,當前運行結點等信息。

@Test
public void queryProcessInstance() {
// 流程定義key
String processDefinitionKey = "holiday";
// 獲取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey)//.list();
for (ProcessInstance processInstance : list) {
          System.out.println("----------------------------");
          System.out.println("流程實例id: "+ processInstance.getProcessInstanceId());
          System.out.println("所屬流程定義id: "+ processInstance.getProcessDefinitionId());
          System.out.println("是否執行完成: " + processInstance.isEnded());
          System.out.println("是否暫停: " + processInstance.isSuspended());
          System.out.println(" 當 前 活 動 標 識 : " +
          processInstance.getActivityId());
}
}

 

 1.6掛起、激活流程實例

某些情況可能由於流程變更需要將當前運行的流程暫停而不是直接刪除,流程暫停后將不會繼續執
行。
1.6.1 全部流程實例掛起

操作流程定義為掛起狀態,該流程定義下邊所有的流程實例全部暫停:
流程定義為掛起狀態該流程定義將不允許啟動新的流程實例,同時該流程定義下所有的流程實例將
全部掛起暫停執行

/**
 *  全部流程實例掛起與激活
 *
 *
 */
public class SuspendProcessInstance {


    public static void main(String[] args) {
        //1.得到ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.查詢流程定義的對象
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("holiday").singleResult();

        //4.得到當前流程定義的實例是否都為暫停狀態
        boolean suspended = processDefinition.isSuspended();

        String processDefinitionId = processDefinition.getId();
        //5.判斷
        if(suspended){
            //說明是暫停,就可以激活操作
            repositoryService.activateProcessDefinitionById(processDefinitionId,true
            ,null);
            System.out.println("流程定義:"+processDefinitionId+"激活");
        }else{
            repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
            System.out.println("流程定義:"+processDefinitionId+"掛起");
        }

    }
}

 

 

 在執行一次

 

 1.6.2 單個流程實例掛起

操作流程實例對象,針對單個流程執行掛起操作,某個流程實例掛起則此流程不再繼續執行, 完成
該流程實例的當前任務將報異常。

/**
 *  單個流程實例掛起與激活
 *
 *
 */
public class SuspendProcessInstance2 {


    public static void main(String[] args) {
        //1.得到ProcessEngine對象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //3.查詢流程實例對象
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processInstanceId("2501").singleResult();

        //4.得到當前流程定義的實例是否都為暫停狀態
        boolean suspended = processInstance.isSuspended();

       String processInstanceId = processInstance.getId();
        //5.判斷
        if(suspended){
            //說明是暫停,就可以激活操作
            runtimeService.activateProcessInstanceById(processInstanceId);
            System.out.println("流程:"+processInstanceId+"激活");
        }else{
            runtimeService.suspendProcessInstanceById(processInstanceId);
            System.out.println("流程定義:"+processInstanceId+"掛起");
        }

    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM