Activiti6.0學習實踐(6)-核心api:RepositoryService 存儲服務

通過前面的學習,我們瞭解到activiti是通過 activiti.cfg.xml獲取到 ProcessEnigneConfiguration對象,這個對象負責管理流程引擎的配置相關信息,通過這個配置管理對象,我們可以創建出ProcessEnigne流程引擎對象。通過流程引擎對象我們可以得到各種服務對象,如:

  1. repositoryService(流程存儲服務)
  2. runtimeService(管理運行時)
  3. TaskService(管理流程中的任務)
  4. IdentityService(管理權限)
  5. FormService(管理表單),
  6. Historyservice(運行結束的查詢功能)
  7. ManagementService(流程引擎基礎管理)
  8. DynamicBpmService(動態管理流程-6.0新增的服務)   

1、RepositoryService

流程存儲服務RepositoryService主要的功能如下:

  1. 管理流程定義文件xml和靜態資源的服務
  2. 對特定流程的暫停和激活
  3. 流程定義啓動權限管理
  4. 部署文件構造器DeploymentBuilder
  5. 部署文件查詢器DeploymentQuery
  6. 流程定義查詢對象ProcessDefinition
  7. 流程定義的java格式BpmnModel

1.1 創建新的module

在idea中通過前面的acitivi腳手架創一個新的module

創建完成後如下圖所示:

1.2 創建一個RepositoryService的測試類

接着我們在test目錄下創建一個測試類

先建立一下這個類的雛形

package com.study.activiti.coreapi;

import org.activiti.engine.RepositoryService;
import org.activiti.engine.test.ActivitiRule;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Describe:
 *
 * @author cwqsolo
 * @date 2020/01/31
 */
public class RerostoryServiceTest {

    private static final Logger logger = LoggerFactory.getLogger(RerostoryServiceTest.class);

    @Rule
    public ActivitiRule  activitiRule = new ActivitiRule();

    @Test
    public void  test(){
        RepositoryService repositoryService = activitiRule.getRepositoryService();
    }


}

我們可以通過ctrl+repositoryService來查看一下這個核心api提供的接口,如下圖,這些接口就是提供了前面說的主要功能。

1.3 完善測試代碼

下面對於一次部署多個流程定義文件進行測試代碼的補充

@Test
public void  test(){
    RepositoryService repositoryService = activitiRule.getRepositoryService();

    //創建一個流程部署對象,並部署兩個流程定義文件
    DeploymentBuilder deployment = repositoryService.createDeployment();
    deployment.name("測試部署資源")
            .addClasspathResource("comm2Level.bpmn20.xml")
            .addClasspathResource("my-process.bpmn20.xml");

    //創建部署對象
    Deployment deploy = deployment.deploy();
    logger.info("deploy ={}", deploy);

    //創建一個部署查詢對象
    DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
    //因爲是一次部署,所以可以用 singleResult
    Deployment deployment1 = deploymentQuery.deploymentId(deploy.getId()).singleResult();

    logger.info("deploy ={}", deployment1);

    //查詢流程定義
    List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery()
            .deploymentId(deploy.getId())
            .listPage(0, 100);

    for (ProcessDefinition processDefinition: processDefinitions) {
        logger.info("processDefinition = {}, version = {}, key={}, id={}",  processDefinition,
                processDefinition.getVersion(),
                processDefinition.getKey(),
                processDefinition.getId());
    }


}

在上述代碼中,通過一次部署兩個流程定義文件,然後將流程定義內容打印出來,執行情況如下:

1.4 流程的掛起和重新啓動

存儲服務提供了流程的掛起和重新啓動的接口代碼如下:

@Test
@org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
public void testSuspend() {
    RepositoryService repositoryService = activitiRule.getRepositoryService();
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
    logger.info("processDefinition.id={}", processDefinition.getId());

    //將流程定義掛起,這個時候如果去啓動會報告異常
    repositoryService.suspendProcessDefinitionById(processDefinition.getId());

    try {
        logger.info("開始啓動");
        activitiRule.getRuntimeService().startProcessInstanceById(processDefinition.getId());
        logger.info("啓動成功");
    } catch (Exception e) {
        logger.info("啓動失敗");
        logger.info(e.getMessage(),e);
    }
    //重新激活,並啓動,這個時候可以啓動成功
    repositoryService.activateProcessDefinitionById(processDefinition.getId());
    try {
        logger.info("重新激活,並開始啓動");
        activitiRule.getRuntimeService().startProcessInstanceById(processDefinition.getId());
        logger.info("啓動成功");
    } catch (Exception e) {
        logger.info("啓動失敗");
        logger.info(e.getMessage(),e);
    }


}

執行日誌如下:

1.5 多次部署的情況

接着我們可以對兩個流程定義文件,進行多次部署,代碼如下:

@Test
public void test() {
    RepositoryService repositoryService = activitiRule.getRepositoryService();

    //創建一個流程部署對象,並部署兩個流程定義文件
    DeploymentBuilder deployment = repositoryService.createDeployment();
    deployment.name("測試部署資源")
            .addClasspathResource("comm2Level.bpmn20.xml")
            .addClasspathResource("my-process.bpmn20.xml");
    //創建部署對象
    Deployment deploy = deployment.deploy();
    logger.info("deploy ={}", deploy);

    //創建第二個流程部署對象,並部署兩個流程定義文件
    DeploymentBuilder deployment2 = repositoryService.createDeployment();
    deployment2.name("測試部署資源2")
            .addClasspathResource("comm2Level.bpmn20.xml")
            .addClasspathResource("my-process.bpmn20.xml");
    //創建部署對象
    Deployment deploy2 = deployment2.deploy();
    logger.info("deploy ={}", deploy2);

    //創建一個部署查詢對象
    DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
    //因爲是一次部署,所以可以用 singleResult
    //Deployment deployment1 = deploymentQuery.deploymentId(deploy.getId()).singleResult();
    //因爲部署了兩次,所以代碼上要做相應變化,返回list
    List<Deployment> deployments = deploymentQuery.orderByDeploymenTime().asc().listPage(0, 100);

    //遍歷deployments-- 用iter方式
    for (Deployment deployment1 : deployments) {
        logger.info("deployment = {}", deployment1);
    }

    logger.info("deploymentlist size = {}", deployments.size());


    //查詢流程定義
    List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery()
            //.deploymentId(deploy.getId())
            .orderByProcessDefinitionKey().asc()
            .listPage(0, 100);

    for (ProcessDefinition processDefinition : processDefinitions) {
        logger.info("processDefinition = {}, version = {}, key={}, id={}", processDefinition,
                processDefinition.getVersion(),
                processDefinition.getKey(),
                processDefinition.getId());
    }


}

 

執行日誌如下:

 

1.6 指定流程執行的用戶和用戶組

存儲服務提供了指定流程的執行用戶和用戶組的接口

下面是測試代碼中的相關測試函數

//

@Test
@org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
public void testCandiateStarter() {
    RepositoryService repositoryService = activitiRule.getRepositoryService();
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
    logger.info("processDefinition.id={}", processDefinition.getId());

    //創建流程和用戶,用戶組關係
    repositoryService.addCandidateStarterUser(processDefinition.getId(), "user");
    repositoryService.addCandidateStarterGroup(processDefinition.getId(), "groupadmin");

    //獲取用戶組關係信息
    List<IdentityLink> identityLinksForProcessDefinition
            = repositoryService.getIdentityLinksForProcessDefinition(processDefinition.getId());

    for (IdentityLink identityLink : identityLinksForProcessDefinition) {
        logger.info("identityLink = {}", identityLink);

    }

    //刪除流程和用戶組關係
    repositoryService.deleteCandidateStarterGroup(processDefinition.getId(), "groupadmin");
    repositoryService.deleteCandidateStarterUser(processDefinition.getId(), "user");


}

試指定用戶組來啓動

執行的情況如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章