activiti内部提供各类服务类来实现各种流程相关操作。
RepositoryService 流程存储服务
- 管理流程定义文件xml及静态资源的服务
- 对特定流程的暂停和激活
- 流程定义启动权限管理
类内部重要的成员有: - deploymentBuilder 部署文件构造器
- deploymentQuery 部署文件查询器
- ProcessDefinitionQuery 流程定义文件查询对象
- Deployment 流程部署文件对象
- ProcessDefinition 流程定义文件对象
- BpmnModel 流程定义的java格式
示例
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.name("yby的流程")
.addClasspathResource("second_approve.bpmn20.xml")
.addClasspathResource("another_approve.bpmn20.xml");
Deployment deployment = deploymentBuilder.deploy();
String deploymentId = deployment.getId();
// 使用repositoryService查询单个部署对象
DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
Deployment deployment1 = deploymentQuery.deploymentId(deploymentId).singleResult();
// 使用repositoryService查询多个部署对象
List<Deployment> deploymentList = deploymentQuery
.orderByDeploymenTime()
.asc()
.listPage(0,100);
// 使用repositoryService查询单个流程实例
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.deploymentId(deploymentId)
.singleResult();
// 使用repositoryService查询多个流程实例
List<ProcessDefinition> processDefinitionList = repositoryService
.createProcessDefinitionQuery()
.deploymentId(deploymentId)
.listPage(0,100);
for(ProcessDefinition processDefinition: processDefinitionList){
logger.info("流程定义为:{},版本为:{}",processDefinition.getName(),processDefinition.getVersion());
}
- 当执行deploymentBuilder.deploy()后就会将当前部署对象和相关资源文件的内容保存到数据库中。示例中执行了两次addClasspathResource方法,说明一次可以部署多个流程,所以部署对象和流程定义对象是一对多的关系。
- DeploymentQuery对象支持根据各种条件的查询,示例中使用部署id。由于使用其他条件可能查出多个部署对象,如果部署id确定只有一个结果,就加上singleResult方法取值。
流程定义挂起和恢复
可以使用repository对流程定义进行挂起和恢复操作,挂起后发起流程实例就会抛出异常,示例如下:
// suspend process definition
repositoryService.suspendProcessDefinitionById(processDefinition.getId());
try {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("second_approve", variables);
} catch (Exception e){
logger.error(e.toString());
}
repositoryService.activateProcessDefinitionById(processDefinition.getId());
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("second_approve", variables);
再上述示例中首先对流程定义挂起后启动流程实例就会抛出异常,后来有激活流程定义,再去启动流程实例就成功了。
关联流程定义和用户
通过将用户或者用户组和流程定义关联,来设置发起流程的候选人或候选组,后续也可以使用repositoryService.getIdentityLinksForProcessDefinition方法来获取IdentityLink(身份信息关联)对象获取用户信息。
repositoryService.addCandidateStarterGroup(processDefinition.getId(),"groupM");
repositoryService.addCandidateStarterUser(processDefinition.getId(),"user");
List<IdentityLink> identityLinkList = repositoryService.getIdentityLinksForProcessDefinition(processDefinition.getId());
for(IdentityLink identityLink : identityLinkList){
logger.info("identityLink:{}",identityLink);
}