Activiti:如何检查当前流程实例是否在给定的中间消息事件上处于挂起状态

时间:2016-10-18 07:31:35

标签: activiti bpm

检查以下情况的最佳方法是: 给定pid正在等待特定的中间消息事件。

我尝试过的一些事情:

Execution execution = runtimeService.createExecutionQuery().processInstanceId(<pId>)
                .activityId(<messageEventName>).singleResult();
if(null!=execution){
//I have got assurance that this pId is pending with this messageEventName currently
}

我的中间消息事件的bmp.xml代码:

<intermediateCatchEvent id="messageintermediatecatchevent1" name="MessageCatchEvent">
    <messageEventDefinition messageRef="actionOnPendingLR"></messageEventDefinition>
  </intermediateCatchEvent>

我的Java代码:

private Execution checkIfProcessPendingOnPendingLRMessage(UserAction request) throws Exception {
    String pId = request.getProcessInstanceId();
    Execution execution = null;
    String messageName = "messageintermediatecatchevent1";
    try {
        execution = runtimeService.createExecutionQuery().processInstanceId(pId)
                .activityId(messageName).singleResult();
    } catch (Exception exe) {
        logger.error("supplied process instance is not matching on the state in which it is pending" + pId, exe);
    }

    if (execution == null) {
        throw new RuntimeException(
                "Couldn't find waiting process instance with id '" + pId + "' for message '" + messageName + "'");
    }
    return execution;

}

&安培;&安培;检查

(null!=checkIfProcessPendingOnPendingLRMessage(request)) //in main method.

任何人都可以确认这是实现我的目标的正确代码/方式。否则,请分享正确的方法。

1 个答案:

答案 0 :(得分:1)

对于一个特定进程的特殊情况,您可以使用.activitiId(),即指定bpmn元素的id(在您的情况下为messageintermediatecatchevent1),而不是它所预订的消息名称。此技术用于activiti用户指南中的messageReceived元素。但它并不是一个好主意,因为您的进程可能会在不同的intermediateMessageCatchingEvents中等待此消息,并且可以在以后重命名元素。

而不是.activitiId()应该使用.messageEventSubscriptionName()。

在更一般的情况下,您可以使用.list()代替.singleresult()并分析其长度。虽然0和1是显而易见的,但是在您的进程中等待消息的多个执行是可能的,可以区别对待。

检查业务键或某个流程变量而不是特定的流程ID也是个好主意。

P.S。请注意,正在处理的消息的名称/ ID可以不同。 AFAIK .messageEventSubscriptionName使用消息的名称,而不是id。