1. 程式人生 > 實用技巧 >Activiti7進階之流程例項

Activiti7進階之流程例項

什麼是流程例項?

  • 參與者(可以是使用者也可以是程式)按照流程定義內容發起一個流程,這就是一個流程例項。是動態的。
  • 以下是流程定義和流程例項的圖解:

啟動流程例項

  • 流程定義部署在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:[email protected]">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);

    }
}

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:[email protected]">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);

    }
}

查詢流程例項(關聯businessKey)

  • 需求:

    • 在Activiti實際應用時,查詢流程例項列表時可能要顯示出業務系統的一些相關資訊,比如:查詢當前執行的請假流程列表需要將請假單名稱、請假天數等資訊顯示出來,請假天數等資訊在業務系統中存在,而並沒有在Activiti資料庫中存在,所以是無法通過Activiti的API查詢到請假天數等資訊。
  • 實現:

    • 在查詢流程例項的時候,通過businessKey(業務標識)關聯查詢業務系統的請假單表,查詢出請假天數等資訊。
    • 通過下面的程式碼就可以獲取到Activiti中所對應例項儲存的key。而這個業務key一般都會儲存相關聯的業務操作表的主鍵,再通過主鍵id去查詢業務資訊,比如通過請假單的id,去查詢更多的請假資訊(請假人、請假時間、請假天數、請假事由等)。
    String businessKeyDb = processInstance.getBusinessKey();
    

流程例項掛起和啟用

概述

  • 某些情況可能由於流程變更需要將當前執行的流程暫停而不是直接刪除,流程暫停後將不會繼續執行。

全部流程例項掛起和啟用

  • 操作流程定義為掛起狀態,該操作定義下面的所有的流程例項將全部暫停。

  • 流程定義為掛起狀態,該流程定義下將不允許啟動新的流程例項,同時該流程定義下的所有流程例項將全部掛起暫停執行。

  • 示例:

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:[email protected]">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() + "掛起");
            }
        }

    }
}

單個流程例項掛起和啟用

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

  • 示例:

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:[email protected]">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() + "掛起");
            }
        }

    }
}