【问题标题】:Camunda BPMN - accessing variables inside a threadCamunda BPMN - 访问线程内的变量
【发布时间】:2014-11-26 09:00:46
【问题描述】:

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

【问题讨论】:

    标签: java spring bpmn camunda


    【解决方案1】:

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

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

    在表达式中,你可以写

    ${service.isThisOrThatEnabled()}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      相关资源
      最近更新 更多