Camunda - 消息中间捕获事件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近遇到一个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请求如下

​​​​​​http://localhost:8080/engine-rest/execution/{executionId}/messageSubscriptions/{event name}/trigger

入参的传递方式如下:

{
  "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>

至此,完成了一个包含“消息中间捕获事件”的流程。


总结

上面以一个简单的业务场景为例,介绍了消息中间捕获事件的用法,以及变量的传入与传出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhao_rock_2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值