一、RepositoryService简介
RepositoryService
- 管理流程定义文件xml及静态资源服务
- 对特定流程的暂停和激活
- 流程定义启动权限管理
- 部署文件构造器DeploymentBuilder
- 部署文件查询器DeploymentQuery
- 流程定义文件查询对象ProcessDefinitionQuery
- 流程部署文件对象Deployment
- 流程定义文件对象ProcessDefinition
- 流程定义的Java格式BpmnModel
相关方法:
相关方法详解:
Deployment对象
- Deployment 对象是一个接口,一个Deployment实例表示一条ACT_RE_DEPLOYMENT表的数据。
- 子接口为DeploymentEntity,实现类为DeploymentEntitylmpl。如果要对属性进行修改,需要调用DeploymentBuilder提供的方法,Deployment只提供了一系列get方法。
DeploymentBuilder对象
- addClasspathResource(String resource):添加classpath下的资源文件 。
- addlnputStream(String resourceName, InputStream inputStream):添加输入流资源。
- addString(String resourceName, String text):添加字符串资源。
- addZipinputStream(ZipinputStream inputStream):添加zip压缩包资源。
- addBpmnModel(String resourceName, BpmnModel bpmnModel):解析BPMN模型对象,并作为资源保存。
- addBytes(String resourceName, byte[] bytes):添加字节资源。
- 除此之外,还提供了修改部署信息的方法,例如key、name、category等 。
ProcessDefinition对象
ProcessDefinition对象是一个接口, 一个ProcessDefinition实例表示一条流程定义数据,在Activiti中,它的实现类为 ProcessDefinitionEntitylmpl,对应的数据表为ACT_RE_PROCDEF。
中止与激活流程定义
- activateProcessDefinitionByld(String processDefinitionld):根据流程定义的id激活流程定义 。
- activateProcessDefinitionByld(String processDefinitionld, boolean activateProcesslnstances, Date activationDate):在某个时间激活流程定义, 需要注意的是activateProcesslnstances参数,如果为true,则该流程定义下的流程实例,也会被激活。
- suspendProcessDefinitionByld(String processDefinitionld):根据流程ID中止流程定义。
- suspendProcessDefinitionByKey(String processDefinitionKey): 根据流程定义文件中的process节点的id属性中止流程定义,也可以看作根据ACT_RE_PROCDEF表中的KEY_字段值中止流程定义。
- 调用了中止流程定义与激活流程定义的四个方法,需要注意的是,如果一个流程定义状态已经为中止状态,再调用中止方法,将会抛出ActivitiException,激活亦然。流程定义一旦被置为中止状态,那么该流程将不允许被启动 。
流程定义权限
- RepositoryService中提供了addCandidateStarterUser方法,给流程定义与用户绑定权限,该方法实际上是向一个中间表中加入数据 ,表示流程与用户之间的关系。addCandidateStarterUser方法的第一个参数为流程定义ID,第二个参数为用户的ID。
- ACT_RU_IDENTITYLNK表用于保存流程中用户组、用户这些身份数据与流程中各个元素之间的关系,这些流程元素包括流程定义、流程任务等。
- 同样RepositoryService也提供了addCandidateStarterGroup方法,该方法可以将流程定义与用户组进行权限绑定。
IdentityLink对象
一个IdentityLink实例表示一种身份数据与流程数据绑定的关系,此处所说的身份数据包括用户组和用户数据,流程数据包括流程定义、流程任务等数据。对应的实现类为IdentityLinkEntityImpI ,对应的数据表为ACT_RU_IDENTITYLINK。
查询权限数据
- 根据用户或者用户组得到相应的流程定义数据。
- ProcessDefinitionQuery的startableByUser方法:该方法用于根据用户ID查询该用户有权限启动的流程定义数据。
- GroupQuery的potentialStarter方法:根据流程定义ID查询有权限启动的用户组数据。
- UserQuery的potentialStarter方法:根据流程定义ID查询有权限启动的用户数据。
- RepositoryService的getldentityLinksForProcessDefinition方法:根据流程定义ID查询与之相关的全部权限数据。
- 根据用户或者用户组得到相应的流程定义数据。
RepositoryService数据查询与删除
- 查询部署的文件、流程描述文件、流程图文件等
- 查询部暑资源
- RepositoryService的getResourceAsStream方法, 只需要提供部署( Deployment) ID和资源名称,就可以返回资源的输入流对象。
- 查询流程文件
- RepositoryService的getProcessModel方法,调用该方法只需要提供流程定义的ID即可返回流程文件的InputStrea m实例。
- 查询流程图
- RepositoryService的getProcessDiagram方法返回该流程图的InputStream对象。
- 查询部署资源名称
- RepositoryService的getDeploymentResourceNames
- 查询部暑资源
- 删除部署资源
- deleteDeployment(String deploymentld):删除部署数据,不进行级联删除,这里所说的级联删除,是指与该部署相关的流程实例数据的删除。
- deleteDeployment(String deploymentld, boolean cascade):是否进行级联删除,由调用者决定。
- 不管删除部署数据时是否指定级联删除,部署的相关数据均会被删除,包括身份数据 ( IdentityLink )、流程定义数据( ProcessDefinition )、流程资源( Resource )与部署数据 ( Deployment )。
- 查询部署的文件、流程描述文件、流程图文件等
DeploymentQuery对象
- deploymentld(String id):添加ID查询条件,查询ID为参数值的数据记录。
- deploymentName(String name): 添加名称查询条件,查询Deployment名称为参数值的数据记录。
- deploymentNameLike(String name): 添加模糊查询条件,查询Deployment名称含有参数值的数据记录。
- orderByDeploymentld :设置查询结果按照Deployment的ID进行排序,排序方式由asc与desc方法决定。
- orderByDeploymentTime : 设置查询结果按照DEPLOY_TIME_字段排序 。
- orderByDeploymentName : 设置查询结果按照Deployment名称排序 。
ProcessDefinitionQuery对象
二、相关代码演示
java
package com.laogoubi.coreapi;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.*;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.test.ActivitiRule;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* @ClassName RepostoryServiceTest
* @Description RepostoryService
* @Author eastern
* @Date 2020/7/1 下午9:41
* @Version 1.0
**/
public class RepostoryServiceTest {
private static final Logger logger = LoggerFactory.getLogger(RepostoryServiceTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti.cfg.xml");
@Test
public void testRepository(){
RepositoryService repositoryService = activitiRule.getRepositoryService();
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.name("测试部署资源")
.addClasspathResource("diagrams/my-process.bpmn20.xml")
.addClasspathResource("diagrams/second_approve.bpmn20.xml");
Deployment deploy = deploymentBuilder.deploy();
logger.info("deploy = {}", deploy);
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
Deployment deployment = deploymentQuery.deploymentId(deploy.getId()).singleResult();
List<ProcessDefinition> processDefinitions =
repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).listPage(0, 100);
for (ProcessDefinition processDefinition : processDefinitions) {
logger.info("processDefinition = {}, version = {}", processDefinition, processDefinition.getVersion());
}
logger.info("processDefinitions.size", processDefinitions.size());
}
@Test
@org.activiti.engine.test.Deployment(resources = {"diagrams/my-process.bpmn20.xml"})
public void testSuspend(){
RepositoryService repositoryService = activitiRule.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
logger.info("processDefinitionQuery.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());
logger.info("开始启动");
activitiRule.getRuntimeService().startProcessInstanceById(processDefinition.getId());
logger.info("启动成功");
}
@Test
@org.activiti.engine.test.Deployment(resources = {"diagrams/my-process.bpmn20.xml"})
public void testCandidateStarter(){
RepositoryService repositoryService = activitiRule.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
logger.info("processDefinitionQuery.id = {}", processDefinition.getId());
repositoryService.addCandidateStarterUser(processDefinition.getId(), "user");
repositoryService.addCandidateStarterGroup(processDefinition.getId(), "groupM");
List<IdentityLink> identityLinksForProcessDefinition =
repositoryService.getIdentityLinksForProcessDefinition(processDefinition.getId());
for (IdentityLink identityLink : identityLinksForProcessDefinition) {
logger.info("identityLink = {}", identityLink);
}
repositoryService.deleteCandidateStarterGroup(processDefinition.getId(), "groupM");
repositoryService.deleteCandidateStarterUser(processDefinition.getId(), "user");
}
}