Flowable入门系列文章27 - Activity解读 03

1、消息事件定义

消息事件是引用已命名消息的事件。消息具有名称和有效载荷。与信号不同,消息事件总是指向单个接收者。

使用messageEventDefinition元素声明消息事件定义。该属性messageRef引用message声明为definitions根元素的子元素的元素。以下是一个过程的摘录,其中两个消息事件是由一个开始事件和一个中间捕获消息事件声明和引用的。

<definitions xmlns:flowable="http://flowable.org/bpmn"
    xmlns:tns="Examples"
    id="definitions"
    targetNamespace="Examples"
    xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">

    <message
        name="newInvoiceMessage"
        id="newInvoice" />

    <message
        name="paymentMessage"
        id="payment" />

    <process id="invoiceProcess">

        <startEvent id="messageStart">

            <messageEventDefinition messageRef="newInvoice" />
        </startEvent>
        ...

        <intermediateCatchEvent id="paymentEvt">

            <messageEventDefinition messageRef="payment" />
        </intermediateCatchEvent>
        ...
    </process>
</definitions>

投掷消息事件
作为一个可嵌入的流程引擎,Flowable并不关心实际接收消息。这将取决于环境,需要特定于平台的活动,例如连接到JMS(Java消息传递服务)队列/主题或处理Web服务或REST请求。因此,消息的接收是您必须实现的,作为嵌入了流程引擎的应用程序或基础架构的一部分。

在您的应用程序中收到消息后,您必须决定如何处理它。如果消息应触发新流程实例的启动,请在运行时服务提供的下列方法之间进行选择:

ProcessInstance startProcessInstanceByMessage(String messageName);
ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey,
Map<String, Object> processVariables);

这些方法使用引用的消息启动一个流程实例。

如果消息需要被现有的流程实例接收,你首先必须将消息关联到一个特定的流程实例,然后触发等待执行的继续。运行时服务根据消息事件订阅提供以下触发执行的方法:

void messageEventReceived(String messageName, String executionId);
void messageEventReceived(String messageName, String executionId, HashMap<String, Object> processVariables);

查询消息事件订阅

  • 在消息开始事件的情况下,消息事件订阅与特定的流程定义相关联。这样的消息订阅可以使用以下查询ProcessDefinitionQuery:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.messageEventSubscription("newCallCenterBooking")
.singleResult();

由于特定消息订阅只能有一个流程定义,所以查询总是返回零或一个结果。如果更新了流程定义,则只有最新版本的流程定义才会订阅消息事件。

  • 在中间catch消息事件的情况下,消息事件订阅与特定的执行相关联。这样的消息事件订阅可以查询使用ExecutionQuery:
Execution execution = runtimeService.createExecutionQuery()
.messageEventSubscriptionName("paymentReceived")
.variableValueEquals("orderId", message.getOrderId())
.singleResult();

这种查询称为相关查询,通常需要关于进程的知识(在这种情况下,给定orderId最多只有一个进程实例)。

消息事件示例(s)

以下是可以使用两个不同消息开始的过程示例:
在这里插入图片描述
如果流程需要不同的方式对不同的启动事件作出反应,但最终会以统一的方式继续,那么这非常有用。

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值