通過前面的學習,我們瞭解到activiti是通過 activiti.cfg.xml獲取到 ProcessEnigneConfiguration對象,這個對象負責管理流程引擎的配置相關信息,通過這個配置管理對象,我們可以創建出ProcessEnigne流程引擎對象。通過流程引擎對象我們可以得到各種服務對象,如:
- repositoryService(流程存儲服務)
- runtimeService(管理運行時)
- TaskService(管理流程中的任務)
- IdentityService(管理權限)
- FormService(管理表單),
- Historyservice(運行結束的查詢功能)
- ManagementService(流程引擎基礎管理)
- DynamicBpmService(動態管理流程-6.0新增的服務)
1、RepositoryService
流程存儲服務RepositoryService主要的功能如下:
- 管理流程定義文件xml和靜態資源的服務
- 對特定流程的暫停和激活
- 流程定義啓動權限管理
- 部署文件構造器DeploymentBuilder
- 部署文件查詢器DeploymentQuery
- 流程定義查詢對象ProcessDefinition
- 流程定義的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");
}
試指定用戶組來啓動
執行的情況如下