边界事件和中间事件区别:边界事件与关联的节点有关,比如在一个节点上设置了一个定时边界事件,过了这个事件,该节点如果还没有审批,可选择取消活动即不需要审批流转到下一节点。中间事件是在一个节点后定义了一个事件,比如在一个节点后定义了一个中间定义事件,在节点审批完后,超过了定时时间会流转到下一节点。总结,边界事件是针对节点的,中间事件是针对流程的。
1.消息事件
消息事件会引用一个命名的消息。每个消息都有名称和内容。和信号不同, 消息事件总会直接发送个一个接受者。
如果消息应该触发启动一个新流程实例, 在下面的RuntimeService的两个方法中选择一个执行:
//根据消息名称发起流程
ProcessInstance startProcessInstanceByMessage(String messageName);
//传入消息名称和流程变量发起流程
ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
//传入消息名称,流程变量和业务key发起流程
ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object> processVariables);
这些方法允许启动对应的消息流程实例。
如果消息需要被运行中的流程实例处理,首先要根据消息找到对应的流程实例然后触发这个等待中的流程。 RuntimeService提供了如下方法可以基于消息事件的订阅来触发流程继续执行:
//根据消息名称和流程执行ID触发消息
void messageEventReceived(String messageName, String executionId);
void messageEventReceived(String messageName, String executionId, HashMap<String, Object> processVariables);
#查询消息事件的订阅
Activiti支持消息开始事件和中间消息事件。
消息开始事件的情况,消息事件订阅分配给一个特定的 processdefinition。这个消息订阅可以使用ProcessDefinitionQuery查询到:
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
messageEventSubscription("newCallCenterBooking").singleResult();
• 因为同时只能有一个流程定义关联到消息的订阅点,查询总是返回0或一个结果。 如果流程定义更新了, 那么只有最新版本的流程定义会订阅到消息事件上。
• 中间捕获消息事件的情况,消息事件订阅会分配给特定的执行。 这个消息事件订阅可以使用ExecutionQuery查询到:
Execution execution = runtime