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

Posted 分享牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
了解更多文章可以关注微信公众号:

以上是关于Flowable入门系列文章27 - Activity解读 03的主要内容,如果未能解决你的问题,请参考以下文章

Flowable入门系列文章18 - 部署Flowable

Flowable入门系列文章20 - 基本的Flowable概念一

Flowable入门系列文章80 - Flowable Designer部署功能

Flowable入门系列文章11 - Flowable API 01

Flowable入门系列文章1-Flowable是什么

Flowable入门系列文章74 - 历史 02