在 Camunda 流程中,我试图访问在 RabbitMQ onMessage 线程内创建的变量......简而言之,我有一个 RabbitMQ 消费者正在监听队列,一旦将消息发布到队列,onMessage 就会执行并在这个 onMessage 中,我启动了 BPMN 流程。
@Component("MyProcessor")
public class MyProcessor implements ChannelAwareMessageListener {
public final void onMessage(Message message, Channel channel){
// create some variables based on the message
....
// do some database lookups based on the message
....
// enrich message based on some other factors
....
SomeService service = new SomeService(message);
if (service.isThisOrThatEnabled()){
System.out.println("Yes, it's enabled");
}
....
runtimeService.startProcessInstanceByKey("ABC");
....
}
}
因此,根据传入的消息,我将某些变量设置为不超出 onMessage 的范围。
当我在 Camunda 中调用服务任务或在服务任务中使用表达式时:
${MyProcessor.isThisOrThatEnabled() == true}
这显然会调用带有 @Component 注释的单例,并且无法访问 onMessage 中的实际消息。如果 MyProcessor.isThisOrThatEnabled 包装了 service.isThisOrThatEnabled,我可能会得到一个空指针异常,因为在创建 Singleton 时服务未初始化,仅在 onMessage 线程内。
所以总结一下我的问题,我如何访问线程内的 BPMN 中的变量......
1:如果单例是在线程中访问变量的错误方式,我还应该如何访问它们?是否可以将该 SomeService 实例注入 BPMN 流?
2:如果服务任务是用于访问这些变量的错误组件,我应该改用哪个组件?