Message Event Definitions(消息事件定义)
消息事件就是引用了一个已经命名的消息事件。一个消息有它的名字和一个负载。不像信号,消息事件总是指向一个信号接收者。
一个消息事件定义通常使用messageEventDefinition 元素来声明。MessageRef 属性引用一个消息元素声明把她当作根元素的定义子元素。下面的例子演示了一个流程有两个消息事件定义并被一个启动事件和一个一个中间捕获消息事件引用。
<definitions id="definitions" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.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>
Throwing a Message Event(抛出一个消息事件)
作为一个嵌入式的流程引擎,activiti 不是很关心接收到一个消息。这要看依赖的环境和特殊平台的活动,例如JMS的链接,Queue/Topic或者Webservice的处理和REST的返回。消息的接收决定了是否实现了应用的某些部分或者是底层的构造。前提是流程引擎是被嵌入的。
在你的应用收到消息的时候,你必须决定对这消息作出什么反映。如果这个消息需要触发一个新的流程实例,从runtimeservice方法中选择。
ProcessInstance startProcessInstanceByMessage(String messageName); ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables); ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object> processVariables);
这些方法允许通过消息引用开启一个流程实例
如果消息需要从现有的实例中获取,你首先必须把消息和目标流程实例关联(查看下一个章节)然后顺序触发等待的执行。Runtimeservice 提供了如下方法去触发一个现有的基础执行通过消息事件订阅。
void messageEventReceived(String messageName, String executionId); void messageEventReceived(String messageName, String executionId, HashMap<String, Object> processVariables);
Querying for Message Event subscriptions(查询消息事件的订阅者)
Activiti支持消息启动事件和中间消息事件
@这种情况下一个消息启动事件,消息事件订阅者和一个独有的流程定义相关连。诸如消息订阅者可以通过ProcessDefinitionQuery查询到。
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .messageEventSubscription("newCallCenterBooking") .singleResult();
这里只有一个流程定义给一个特定的消息订阅者,查询结果总是返回0或者一个结果。如果一个流程定义被更新了,只有最新的流程定义版本会得到这个消息事件的订阅。
@一个中间捕获消息事件,消息事件订阅和一个特定的执行关联。诸如消息事件可以使用ExecutionQuery获取
Execution execution = runtimeService.createExecutionQuery() .messageEventSubscriptionName("paymentReceived") .variableValueEquals("orderId", message.getOrderId()) .singleResult();
通过给出的orderid只有有一个流程实例。
Message Event examples
这对于一个流程需要二选一的方式去影响不同的开始事件但是事实上和原来的一样在继续。