Skip to content
一、RepositoryService简介
  • RepositoryService

    • 管理流程定义文件xml及静态资源服务
    • 对特定流程的暂停和激活
    • 流程定义启动权限管理
    • 部署文件构造器DeploymentBuilder
    • 部署文件查询器DeploymentQuery
    • 流程定义文件查询对象ProcessDefinitionQuery
    • 流程部署文件对象Deployment
    • 流程定义文件对象ProcessDefinition
    • 流程定义的Java格式BpmnModel
  • 相关方法:

    image-20200716122305548

    image-20200716122348366

  • 相关方法详解:

    • Deployment对象

      image-20200716165650489

      • Deployment 对象是一个接口,一个Deployment实例表示一条ACT_RE_DEPLOYMENT表的数据。
      • 子接口为DeploymentEntity,实现类为DeploymentEntitylmpl。如果要对属性进行修改,需要调用DeploymentBuilder提供的方法,Deployment只提供了一系列get方法。
    • DeploymentBuilder对象

      image-20200716164934160

      • 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对象

      image-20200716171131166

      • ProcessDefinition对象是一个接口, 一个ProcessDefinition实例表示一条流程定义数据,在Activiti中,它的实现类为 ProcessDefinitionEntitylmpl,对应的数据表为ACT_RE_PROCDEF。

      • 中止与激活流程定义

        image-20200716171836570

        • 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对象

      image-20200717150822887

      • deploymentld(String id):添加ID查询条件,查询ID为参数值的数据记录。
      • deploymentName(String name): 添加名称查询条件,查询Deployment名称为参数值的数据记录。
      • deploymentNameLike(String name): 添加模糊查询条件,查询Deployment名称含有参数值的数据记录。
      • orderByDeploymentld :设置查询结果按照Deployment的ID进行排序,排序方式由asc与desc方法决定。
      • orderByDeploymentTime : 设置查询结果按照DEPLOY_TIME_字段排序 。
      • orderByDeploymentName : 设置查询结果按照Deployment名称排序 。
    • ProcessDefinitionQuery对象

      image-20200717151403930

二、相关代码演示
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");
	}
}

Released under the MIT License.