Camunda BPMN - доступ к переменным внутри потока

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

Итак, чтобы резюмировать мой вопрос, как мне получить доступ к переменным в BPMN, которые находятся внутри потока ...

1: Если синглтоны - неправильный способ доступа к переменным в потоке, как еще я должен получить к ним доступ? Можно ли внедрить этот экземпляр SomeService в поток BPMN?

2: Если служебные задачи - это неправильный компонент, который нужно использовать для доступа к этим переменным, какой компонент мне следует использовать вместо этого?


person Jan Vladimir Mostert    schedule 26.11.2014    source источник


Ответы (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 и который вы заполните соответствующими свойствами службы / сообщения, которые нужны вашему процессу.

person thorben    schedule 26.11.2014