前言
目前Camunda提供了5种不同类型的网关:Parallel Gateway(并行网关),Complex Gateway(复杂网关) ,Exclusive Gateway(独占网关),Inclusive Gateway(包容网关),Event-based Gateway(事件网关)。本文主要介绍Parallel Gateway(并行网关)。
一、并行网关使用场景
并行网关适用于,当多个条件任务同时执行完毕时,流程才能继续向下进行的场景。
二、并行网关使用示例
1.流程图
在上述流程图中,当task-a执行完毕时,进入并行网关。只有当task-b和名为Event_Gateway_Test的message intermediate catch event组件都成功执行时,流程才会继续下去,执行task-c.
2.演示
2.1 service task任务实现
文中的service-task基于external-task实现,具体代码如下
public class ParallelGatewayTest {
private final static Logger LOGGER = Logger.getLogger(ParallelGatewayTest.class.getName());
public static void main(String[] args) {
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest")
.build();
client.subscribe("task-a")
.lockDuration(30000) // 默认锁定时间为20秒
.handler((externalTask, externalTaskService) -> {
// 获取流程变量
LOGGER.info("execute task-a ");
LOGGER.info("ExecutionId: "+ externalTask.getExecutionId());
LOGGER.info("ProcessInstanceId: "+ externalTask.getProcessInstanceId());
LOGGER.info("complete task-a ");
// 完成任务
externalTaskService.complete(externalTask);
})
.open();
// 订阅指定的外部任务
client.subscribe("task-b")
.lockDuration(30000) // 默认锁定时间为20秒
.handler((externalTask, externalTaskService) -> {
// 获取流程变量
LOGGER.info("execute msg of task-b ");
LOGGER.info("ExecutionId: "+ externalTask.getExecutionId());
LOGGER.info("ProcessInstanceId: "+ externalTask.getProcessInstanceId());
LOGGER.info("complete task-b ");
// 完成任务
externalTaskService.complete(externalTask);
})
.open();
// 订阅指定的外部任务
client.subscribe("task-c")
.lockDuration(30000) // 默认锁定时间为20秒,这里修改为1秒
.handler((externalTask, externalTaskService) -> {
// 获取流程变量
LOGGER.info("execute msg of task-c ");
LOGGER.info("ExecutionId: "+ externalTask.getExecutionId());
LOGGER.info("ProcessInstanceId: "+ externalTask.getProcessInstanceId());
String test_input = (String) externalTask.getVariable("test_input");
LOGGER.info("test_input: "+test_input);
String test_output = (String) externalTask.getVariable("test_output");
//Integer output = (Integer) externalTask.getVariable("Output");
LOGGER.info("test_output: "+test_output);
LOGGER.info("complete task-c ");
// 完成任务
externalTaskService.complete(externalTask);
})
.open();
}
}
2.2 执行消息中间捕获事件(message intermediate catch event)
可参见:Camunda - 消息中间捕获事件_zhao_rock_2016的博客-CSDN博客
2.3 流程执行过程
1.启动流程后,首先进入task-a中
2.当task-a执行后,进入并行网关,可以看到task-b执行完毕,在并行网关出有1的计数标识,此时触发并行网关的另外一个条件,Event_Gateway_Test的message intermediate catch event组件还没有被执行。
3.当Event_Gateway_Test的message intermediate catch event组件被执行后,流程继续进入到task-c中。
总结
本文主要介绍Parallel Gateway(并行网关)的业务场景和使用方法。