本章概述
流程引擎及服务
流程引擎存储服务
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
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>
任务管理服务(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>