1 Star 0 Fork 2

Flowable_BPMN / demo04

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

环境:  

jkd8+

mysql5.6+

flowable6.4.0

1、原理

1.1 消息事件定义

消息事件是引用命名消息的事件。消息具有名称和有效负载。与信号不同,消息事件始终指向单个接收器

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

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

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

  <process id="invoiceProcess">

    <startEvent id="messageStart" >
    	<messageEventDefinition messageRef="newInvoice" />
    </startEvent>
    ...
    <intermediateCatchEvent id="paymentEvt" >
    	<messageEventDefinition messageRef="payment" />
    </intermediateCatchEvent>
    ...
  </process>

</definitions>

1.2 抛出一个消息事件

作为可嵌入的流程引擎,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);

1.3 查询消息事件订阅

  • 在消息启动事件的情况下,消息事件订阅与特定的流程定义相关联。可以使用以下命令查询此类消息订阅ProcessDefinitionQuery
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
      .messageEventSubscription("newCallCenterBooking")
      .singleResult();

由于特定邮件订阅只能有一个流程定义,因此查询始终返回零或一个结果。如果更新了流程定义,则只有最新版本的流程定义才能订阅消息事件。

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

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

1.4 边界消息触发

消息在接收messageEventReceived的时候,会触发对应边界消息事件。

2、流程图

3、配置

  • 消息定义定义

     <message id="newInvoice" name="newInvoiceMessage" />
  • 中间消息抛出事件定义以及消息引用

<intermediateCatchEvent id="intermediatemessageevent" name="中间消息抛出事件">
      <messageEventDefinition messageRef="newInvoice"></messageEventDefinition>
</intermediateCatchEvent>
  • 边界消息事件定义以及消息引用
    <boundaryEvent id="boundarymessage" name="边界消息事件" attachedToRef="usertask" cancelActivity="true">
      <messageEventDefinition messageRef="newInvoice"></messageEventDefinition>
    </boundaryEvent>

4、实践测试

  • 部署

    deploy()
  • 启动

    startProcessInstanceByKey()
  • 接收消息

    receiveMessage()
  • 查看数据表

    SELECT * FROM flowable.ACT_RU_EXECUTION;
    SELECT * FROM flowable.ACT_RU_EVENT_SUBSCR;

空文件

简介

消息事件实践 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/Flowable_BPMN/demo04.git
git@gitee.com:Flowable_BPMN/demo04.git
Flowable_BPMN
demo04
demo04
master

搜索帮助

14c37bed 8189591 565d56ea 8189591