本章概述
流程引擎及服务
流程引擎存储服务
RepositoryService
- 管理流程定义文件xml及静态的服务
- 对特定的流程的暂停和激活
- 流程定义启动权限管理
- 部署文件构造器DeploymentBuilder
- 部署文件查询器DeploymentQuery
- 流程定义文件查询对象ProcessDefinitionQuery
- 流程部署文件对象Deployment
- 流程定义文件对象ProcessDefinittion
- 流程定义的Java格式BpmnModel(BpmnModel是纯Java的数据结构List或者Map )
流程存储服务-RepositoryService
-
RepostoryServiceTest
private static final Logger LOGGER = LoggerFactory.getLogger(RepostoryServiceTest.class); @Rule public ActivitiRule activitiRule = new ActivitiRule(); @Test public void testRepostory() { RepositoryService repositoryService = activitiRule.getRepositoryService(); // 第一次部署 DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); deploymentBuilder.name("测试部署资源") .addClasspathResource("my-process.bpmn20.xml") .addClasspathResource("second_approve.bpmn20.xml"); // 第二次部署 DeploymentBuilder deployment1 = repositoryService.createDeployment(); deployment1.name("测试部署资源") .addClasspathResource("my-process.bpmn20.xml") .addClasspathResource("second_approve.bpmn20.xml"); deployment1.deploy(); Deployment deploy = deploymentBuilder.deploy(); LOGGER.info(" deploy ={}", deploy); DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery(); List<Deployment> deployments = deploymentQuery // .deploymentId(deploy.getId()) .orderByDeploymenTime().asc() .listPage(0, 100); for (Deployment deployment : deployments) { LOGGER.info("deployment = {}", deployment); } LOGGER.info("deployments.size() = {}", deployments.size()); List<ProcessDefinition> definitionList = repositoryService.createProcessDefinitionQuery() // .deploymentId(deployment.getId()) .orderByProcessDefinitionKey().asc() .listPage(0, 100); for (ProcessDefinition processDefinition : definitionList) { LOGGER.info("processDefinition= {},version ={}, key = {},id ={}", processDefinition, processDefinition.getVersion() , processDefinition.getKey() , proce ssDefinition.getId()); } } -
测试结果
- 6个生成文件部署资料如下图
- testSuspend
@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());
LOGGER.info("开始启动");
activitiRule.getRuntimeService().startProcessInstanceById(processDefinition.getId());
LOGGER.info("启动成功");
}
@Test
@org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"})
public void testCandidateStarter() {
RepositoryService repositoryService = activitiRule.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.singleResult();
LOGGER.info("processDefinition.id = {}", processDefinition.getId());
repositoryService.addCandidateStarterUser(processDefinition.getId(), "user");
repositoryService.addCandidateStarterGroup(processDefinition.getId(), "groupM");
List<IdentityLink> identityLinks = repositoryService.getIdentityLinksForProcessDefinition(processDefinition.getId());
for (IdentityLink identityLink : identityLinks) {
LOGGER.info("identityLink", identityLink);
}
repositoryService.deleteCandidateStarterGroup(processDefinition.getId(), "groupM");
repositoryService.deleteCandidateStarterUser(processDefinition.getId(), "user");
}
流程运行控制服务
RuntimeService
- 启动流程及对流程数据控制
- 流程实例(ProcessInstance)与执行流(Execution)查询
- 触发流程操作,接受消息和信息
RuntimeService 启动流程及变量管理
-
启动流程的常用方式(id,key,message)
-
启动流程可选参数(businessKey,varibles,teandId)
- businessKey是唯一标致
-
变量(variables)的设置和获取
-
代码如下
public class RuntimeServiceTest { private static final Logger LOGGER = LoggerFactory.getLogger(RuntimeServiceTest.class); @Rule public ActivitiRule activitiRule = new ActivitiRule(); @Test // 根据key去启动 @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"}) public void testStartProcess() { RuntimeService runtimeService = activitiRule.getRuntimeService(); HashMap<String, Object> variables = Maps.newHashMap(); variables.put("key1", "value1"); ProcessInstance processInstance = runtimeService .startProcessInstanceByKey("my-process", variables); LOGGER.info("processInstance = {}", processInstance); } @Test // 根据id去启动 @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"}) public void testStartProcessById() { RuntimeService runtimeService = activitiRule.getRuntimeService(); ProcessDefinition processDefinition = activitiRule.getRepositoryService() .createProcessDefinitionQuery().singleResult(); HashMap<String, Object> variables = Maps.newHashMap(); variables.put("key1", "value1"); ProcessInstance processInstance = runtimeService .startProcessInstanceById(processDefinition.getId(), variables); LOGGER.info("processInstance = {}", processInstance); } @Test // 根据流程实例去启动 @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"}) public void testProcessInstanceBuilder() { RuntimeService runtimeService = activitiRule.getRuntimeService(); HashMap<String, Object> variables = Maps.newHashMap(); variables.put("key1", "value1"); ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder(); ProcessInstance processInstance = processInstanceBuilder.businessKey("businessKey001") .processDefinitionKey("my-process") .variables(variables) .start(); /*ProcessInstance processInstance = runtimeService .startProcessInstanceByKey("my-process", variables); */ LOGGER.info("processInstance = {}", processInstance); } @Test @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"}) public void testVariables() { RuntimeService runtimeService = activitiRule.getRuntimeService(); HashMap<String, Object> variables = Maps.newHashMap(); variables.put("key1", "value1"); variables.put("key2", "value2"); ProcessInstance processInstance = runtimeService .startProcessInstanceByKey("my-process", variables); runtimeService.setVariable(processInstance.getId(), "key3", "values3"); runtimeService.setVariable(processInstance.getId(), "key2", "values2_1"); Map<String, Object> variables1 = runtimeService.getVariables(processInstance.getId()); LOGGER.info("variables1 = {}", variables1); } @Test @org.activiti.engine.test.Deployment(resources = {"my-process.bpmn20.xml"}) public void testProcessInstanceQuery() { RuntimeService runtimeService = activitiRule.getRuntimeService(); HashMap<String, Object> variables = Maps.newHashMap(); variables.put("key1", "value1"); variables.put("key2", "value2"); ProcessInstance processInstance = runtimeService .startProcessInstanceByKey("my-process", variables); LOGGER.info("processInstance = {}", processInstance); ProcessInstance processInstance1 = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstance.getId()).singleResult(); List<Execution> executions = runtimeService.createExecutionQuery() .listPage(0, 100); for (Execution execution : executions) { LOGGER.info("execution = {}", execution); } } }流程实例与执行流
-
流程实例(ProcessInstance)表示一次工作流业务的数据实体
-
执行流(Execution)表示流程实例中具体执行路径
-
流程实例接口继承执行流
流程触发
- 使用trigger触发ReceiveTask节点
- 触发信号捕获事件signalEventReceived
- 触发消息捕获事件messageEventReceived
流程触发Trigger
- Java代码
@Test
@org.activiti.engine.test.Deployment(resources = {"my-process-trigger.bpmn20.xml"})
public void testTrigger() {
RuntimeService runtimeService = activitiRule.getRuntimeService();
// 开启流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process");
Execution execution = runtimeService.createExecutionQuery().activityId("someTask").singleResult();
LOGGER.info("execution = {}", execution);
runtimeService.trigger(execution.getId());
execution = runtimeService.createExecutionQuery().activityId("someTask").singleResult();
LOGGER.info("execution = {}", execution);
}
-
my-process-trigger.bpmn20.xml
<process id="my-process"> <startEvent id="start"/> <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask"/> <!-- <userTask id="someTask" name="Activiti is awesome!" />--> <receiveTask id="someTask"/> <sequenceFlow id="flow2" sourceRef="someTask" targetRef="end"/> <endEvent id="end"/> </process>
流程触发signalEventRecvied
-
Java代码
@Test @org.activiti.engine.test.Deployment(resources = {"my-process-signal-received.bpmn20.xml"}) public void testSignalEventReceived() { RuntimeService runtimeService = activitiRule.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process"); Execution execution = runtimeService.createExecutionQuery().signalEventSubscriptionName("my-signal").singleResult(); LOGGER.info("execution = {}", execution); runtimeService.signalEventReceived("my-process"); execution = runtimeService.createExecutionQuery().signalEventSubscriptionName("my-signal").singleResult(); LOGGER.info("execution = {}", execution); }
-
my-process-signal-received.bpmn20.xml
<signal id="messageStart" name="my-message"></signal> <process id="my-process"> <startEvent id="start"/> <sequenceFlow id="flow1" sourceRef="start" targetRef="message-received"/> <intermediateCatchEvent id="message-received"> <signalEventDefinition signalRef="messageStart"/> </intermediateCatchEvent> <!-- <userTask id="someTask" name="Activiti is awesome!"/>--> <sequenceFlow id="flow2" sourceRef="message-received" targetRef="end"/> <endEvent id="end"/> </process>
流程触发messageEventRecevied
-
Java代码
@Test @org.activiti.engine.test.Deployment(resources = {"my-process-message-received.bpmn20.xml"}) public void testMessageEventReceived() { RuntimeService runtimeService = activitiRule.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-message"); Execution execution = runtimeService.createExecutionQuery().messageEventSubscriptionName("my-message").singleResult(); LOGGER.info("execution = {}", execution); runtimeService.signalEventReceived("my-process"); execution = runtimeService.createExecutionQuery().messageEventSubscriptionName("my-message").singleResult(); LOGGER.info("execution = {}", execution); } -
my-process-message-received.bpmn20.xml
<signal id="messageStart" name="my-message"></signal>
<process id="my-process">
<startEvent id="start"/>
<sequenceFlow id="flow1" sourceRef="start" targetRef="message-received"/>
<intermediateCatchEvent id="message-received">
<signalEventDefinition signalRef="messageStart"/>
</intermediateCatchEvent>
<!-- <userTask id="someTask" name="Activiti is awesome!"/>-->
<sequenceFlow id="flow2" sourceRef="message-received" targetRef="end"/>
<endEvent id="end"/>
</process>
任务管理服务(TaskService)
- 对用户任务(UserTask)管理和流程控制
- 设置用户任务(UserTask)的权限信息(拥有者,候选人,办理人)
- 针对用户任务添加任务附件,任务评论和事件评论
TaskService对Task管理和流程控制
-
Task对象创建,删除
-
查询Task,并驱动Task节点完成执行
-
Task相关参数 变量(variable)设置
-
Java代码
@Test @Deployment(resources = {"my-process-task.bpmn20.xml"}) public void testTaskService() { HashMap<String, Object> variables = Maps.newHashMap(); variables.put("message", "my test message!!!"); ProcessInstance processInstance = activitiRule.getRuntimeService() .startProcessInstanceByKey("my-process", variables); TaskService taskService = activitiRule.getTaskService(); Task task = taskService.createTaskQuery().singleResult(); LOGGER.info("task = {}", ToStringBuilder.reflectionToString(task, ToStringStyle.JSON_STYLE)); LOGGER.info("task.description = {}", task.getDescription()); } -
my-process-task.bpmn20.xml
<process id="my-process"> <startEvent id="start"/> <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask"/> <userTask id="someTask" name="Activiti is awesome!" activiti:candidateUsers="jimmy,user1,user2"> <documentation>some Task ${message}</documentation> </userTask> <sequenceFlow id="flow2" sourceRef="someTask" targetRef="end"/> <endEvent id="end"/> </process>