2014-11-26 3 views
0

В потоке процесса Camunda я пытаюсь получить доступ к переменным, созданным внутри потока RabbitMQ onMessage ... Короче говоря, у меня есть потребитель RabbitMQ, который слушает очередь, один раз сообщение публикуется в очередь, onMessage выполняется, и внутри этого onMessage я запускаю процесс BPMN.Camunda 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

Вы можете установить переменный процесс как

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

В выражении, вы можете написать

${service.isThisOrThatEnabled()} 

выше предполагает, что SomeService реализует интерфейс java.io.Serializable. Если это не так, вы можете создать класс POJO, который реализует Serializable, и что вы заполняете соответствующие свойства службы/сообщения, необходимые вашему процессу.

+0

Это прекрасно работает, спасибо торбен! –

Смежные вопросы