提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
最近遇到一个Camunda的应用场景,在事件流的过程中,流程中的一步依赖回调来触发,这种情况下这个流程该如何设计呢?在这里我使用了事件里的一个名为消息中间捕获事件的组件(message intermediate catch event)。
一、Camunda是什么?
Camunda是一个开源的工作流和决策自动化平台。
更多详细的介绍可以看下官网
英文的:The Universal Process Orchestrator | Camunda
中文的:Camunda 中文站 | docs.camunda.org
Camunda提供RestAPI接口的访问形式并已与swagger进行集成,如果是在自己本地的开发机器上部署,可以通过访问http://localhost:8080/swaggerui 查看API文档。
二、应用场景
1.BPMN流程图
背景:名为“处理逻辑”的外部任务,需要左侧的“消息中间捕获事件”组件来进行触发,话不多说,上图。
2.在事件中定义输入输出变量
输入变量的定义:例如我们想在事件中定义一个名为“msg_status”的变量,用于接收传入到事件的数据。
输出变量的定义:在事件中定义一个名为“Output”的变量,用于输出“msg_status”的值。
3.流程触发及示例代码
当把上述流程部署到Camunda Server后,首先要获取事件的executionId.
1)首先调用Get请求获取当前所有订阅的事件,然后根据全局唯一的事件名称,查找对应的executionId.
获取当前所有订阅的事件Rest API请求如下
http://localhost:8080/engine-rest/event-subscription GET方法
2)触发事件,根据executionId和event_name触发事件。
触发event的Rest API请求如下
入参的传递方式如下:
{
"variables": {
"msg_status": {
"value": "wwwsd",
"type": "String"
}
}
}
3) 名为“处理逻辑”的外部任务
主要是接受输入参数,并打印日志,用于验证接受事件中的变量。
public class MsgReceiveFlowTest {
private final static Logger LOGGER = Logger.getLogger(MsgReceiveFlowTest.class.getName());
public static void main(String[] args) {
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest")
.asyncResponseTimeout(10000) // 长轮询超时时间
.build();
// 订阅指定的外部任务
client.subscribe("demo_logic")
.lockDuration(1000) // 默认锁定时间为20秒,这里修改为1秒
.handler((externalTask, externalTaskService) -> {
// 获取流程变量
LOGGER.info("execute msg of demo_logic ");
String msg_status = (String) externalTask.getVariable("msg_status");
LOGGER.info("msg_status: "+msg_status);
String output = (String) externalTask.getVariable("Output");
LOGGER.info("output: "+output);
// 完成任务
externalTaskService.complete(externalTask);
})
.open();
}
}
上述代码采用的是camunda external task client的模式,所以需要引入依赖
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>7.15.0</version>
</dependency>
至此,完成了一个包含“消息中间捕获事件”的流程。
总结
上面以一个简单的业务场景为例,介绍了消息中间捕获事件的用法,以及变量的传入与传出。