gpt4 book ai didi

java - Camunda BPMN - 访问线程内的变量

转载 作者:行者123 更新时间:2023-12-01 18:23:00 24 4
gpt4 key购买 nike

在 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 实例注入(inject)到 BPMN 流中?

2:如果服务任务是用于访问这些变量的错误组件,我应该使用哪个组件?

最佳答案

您可以设置一个流程变量,例如

Map<String, Object> variables = new HashMap<String, Object>();
variables.put("service", service);
runtimeService.startProcessInstanceByKey("ABC", variables);

在表达式中,您可以编写

${service.isThisOrThatEnabled()}

上面假设SomeService实现接口(interface)java.io.Serialized。如果情况并非如此,您可以创建一个实现 Serialized 的 POJO 类,并填充流程所需的相关服务/消息属性。

关于java - Camunda BPMN - 访问线程内的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27144930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com