据我所知,当数据达到等待状态时,它会在Flowable中持久化。
在我们的流程中,我们有一个委托,它正在启动计算并记录ID以进行跟踪,并等待JMS消息重新启动流程,如下所示:
在“开始计算”委托中,我们有如下代码:
String id = calculationService.startCalculation().getId();
execution.setVariable(CORRELATION_KEY, id);
loggingService.updateCase(id);
此计算和此日志记录都需要一些时间。有时日志记录比计算花费更多时间——这意味着JMS消息在“开始计算”委托完成之前到达。
如果发生这种情况,相关性:
ProcessInstance instance =
this.runtimeService.createProcessInstanceQuery()
.variableValueEquals(CORRELATION_KEY, correlationValue)
.singleResult();
不会导致任何答案,并且该过程将无限期等待。大多数时候,当日志记录比计算快时,这不是问题。
我该如何解决这个问题,在委托完成之前,我还没有找到任何强制持久化变量的方法。我想我可以等一分钟,然后在MessageHandler类中重试,但是由于有许多JMS消息来了,但只有少数消息真正相关,我觉得这会引起不必要的噪音。
也许如果我将日志记录移动到它自己的委托,并为此使用一个包容性网关,catch事件将解决它。但希望有一个更优雅的解决方案。
我想你要找的是一个TriggerableServiceTask。这个任务实现了执行()和触发()方法,允许流程实例在外部系统响应后继续前进。查看这个解释和例子:从jms消息侦听器重新启动可流动的流程