0

在 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:如果服务任务是用于访问这些变量的错误组件,我应该改用哪个组件?

4

1 回答 1

4

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

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

在表达式中,您可以编写

${service.isThisOrThatEnabled()}

以上假设SomeService实现了接口java.io.Serializable。如果不是这种情况,您可以创建一个 POJO 类来实现Serializable并填充您的流程所需的相关服务/消息属性。

于 2014-11-26T09:34:52.330 回答