检查以下情况的最佳方法是: 给定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.
任何人都可以确认这是实现我的目标的正确代码/方式。否则,请分享正确的方法。
答案 0 :(得分:1)
对于一个特定进程的特殊情况,您可以使用.activitiId(),即指定bpmn元素的id(在您的情况下为messageintermediatecatchevent1),而不是它所预订的消息名称。此技术用于activiti用户指南中的messageReceived元素。但它并不是一个好主意,因为您的进程可能会在不同的intermediateMessageCatchingEvents中等待此消息,并且可以在以后重命名元素。
而不是.activitiId()应该使用.messageEventSubscriptionName()。
在更一般的情况下,您可以使用.list()代替.singleresult()并分析其长度。虽然0和1是显而易见的,但是在您的进程中等待消息的多个执行是可能的,可以区别对待。
检查业务键或某个流程变量而不是特定的流程ID也是个好主意。
P.S。请注意,正在处理的消息的名称/ ID可以不同。 AFAIK .messageEventSubscriptionName使用消息的名称,而不是id。