Camunda如何使用信号事件

Camunda信号事件(Signal Events)是引用一个命名信号的事件。信号是全局作用域的事件(广播语义),并被传递给所有活动处理程序。。


Camunda消息事件包括:Signal Start Event(信号启动事件)、Signal Intermediate Catching Event(信号中间捕获事件)、Signal Boundary Event(信号边界事件)、Signal Intermediate Throwing Event(信号中断抛出事件)、Signal End Event(信号结束事件)。


本文重点介绍Signal Intermediate Throwing Event(信号中间抛出事件)和Signal Boundary Event(信号边界事件),其它事件请参考camunda官方文档:https://docs.camunda.org/manual/7.15/reference/bpmn20/events/


一、设计流程图


以下通过模拟贷款利率变动,通过信号触发,通知正在审批贷款的流程,来说明如何通过信号中断抛出事件和信号边界事件的使用。


修改利率主流程:



发送信号事件节点配置:



主流程BPMN流程模型文件:


<?xml version="1.0" encoding="UTF-8"?>                    Flow_14w0uh2      Flow_1akp21w                        Flow_1akp21w              Flow_0tu0a6n      Flow_14w0uh2              Flow_0tu0a6n                                                                                                                                                                                                                                              



贷款申请子流程:



信号事件接收节点配置:



子流程BPMN流程模型文件:


<?xml version="1.0" encoding="UTF-8"?>            Flow_1cd44ow                          Flow_1cd44ow      Flow_1agstqr      Flow_0fcescd              Flow_0fcescd      Flow_1s86ukb              Flow_1s86ukb      Flow_0lcq0a8              Flow_1agstqr                        Flow_0lcq0a8                                                                                                                                                                                                                                                                                                                    



二、发起流程测试


通过demo用户登录camunda平台http://localhost:8080/camunda/app/tasklist/default/#/login,分别发起主子流程。



启动主流程后,流程状态如下,注意还没有到信号事件触发节点:



启动子流程后,流程状态如下,注意此时子流程在信号事件接收节点等待:



此时,数据库表中数据的状态如下:



此时,提交主流程,让主流程走到信号触发节点,由于子流程由于一直在监听该信号,子流程自动触发流程状态变化,如下:



三、信号事件接口说明


  1. 触发(抛出)一个信号(Triggering (Throwing) Signals):


信号可以通过BPMN构造,或通过Java API编程构造抛出,RuntimeService提供了流式API去抛出一个信号:


// 广播一个信号


runtimeService  .createSignalEvent("signalName")  .setVariables(variables)  .send();// 传递一个信号到单个executionruntimeService  .createSignalEvent("signalName")  .executionId(executionId)  .setVariables(variables)  .send(); 


2、使用RuntimeService接口:


RuntimeService.signalEventReceived(String signalName);RuntimeService.signalEventReceived(String signalName, String executionId);


如果提供了executionId,则信号只会被传递给指定的execution。否则信号将会被全局抛出给所有订阅了的handler(广播)。注意:信号事件不会关联到特定的流程实例,相反,它会广播到所有流程实例。如果你需要传递给特定的流程实例,不要使用抛出信号事件(throwing signal event),查询出这个特定的执行(execution),然后将信号传递给这个特定的执行(execution)。


3、查询信号事件订阅(Querying for Signal Event Subscriptions):


可以查询所有订阅了某个特定信号事件的订阅


List executions = runtimeService.createExecutionQuery()    .signalEventSubscriptionName("alert")    .list();


参考:



https://docs.camunda.org/manual/7.15/reference/bpmn20/events/signal-events/



发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章