Receivetask в camunda не работает должным образом

Мы использовали версию camunda 7.4 в большинстве наших проектов вместе с camunda-bpm-spring-boot-starter 1.1.0.

У нас есть проект, в котором в потоке camunda мы пытаемся опубликовать сообщение для брокера сообщений, которое внутренне используется другой системой, и повторно публикуем новое сообщение для того же брокера сообщений. Затем мы запускаем receiveTask, чтобы получить это сообщение и продолжить обработку. Для прослушивания входящего сообщения мы используем org.springframework.amqp.core.MessageListener и определяем взаимосвязь сообщений для receiveTask в методе onMessage (). Но при этом мы получаем ошибку ниже

org.camunda.bpm.engine.MismatchingMessageCorrelationException: не удается сопоставить сообщение ReceiveAmsharedResponse: определение процесса или выполнение не соответствует параметрам

Мы пытаемся понять, в чем проблема? Это в версии camunda, которую мы используем, или проблема связана с использованием receiveTask. Мы испробовали все подходы, определенные в https://docs.camunda.org/manual/7.4/reference/bpmn20/tasks/receive-task/, но не повезло.

Для метода createMessageCorrelation мы получаем ошибку выше. А для других методов мы получаем NPE, поскольку объекты EventSubscription / Execution имеют значение NULL.

Пример использования receiveTask потока Camunda приведен ниже:

 <bpmn2:receiveTask id="ReceiveTask" name="Receive Task" messageRef="Message_06nl07f">
  <bpmn2:incoming>SequenceFlow_xyz</bpmn2:incoming>
  <bpmn2:outgoing>SequenceFlow_190m9nx</bpmn2:outgoing>
</bpmn2:receiveTask>
......
......
<bpmn2:message id="Message_06nl07f" name="Message" />

И пример кода отношения сообщения:

 class XYZ implements MessageListener {
 onMessage() {
    runtimeService.createMessageCorrelation("Message")
                .processInstanceBusinessKey(resourceId)
                .setVariable(ACTIVITY_RESULT, activityResult)
                .correlate();
 }

Любая помощь будет оценена?

Спасибо, Вишванатх


person Sai Viswanath VKS Palaparthi    schedule 13.03.2017    source источник


Ответы (3)


Предположим, ваш процесс выглядит примерно так:

O -- ( M ) -- ( M ) -- O
     send    receive

Если ответное сообщение отправляется очень быстро, возможно, что onMessage и корреляция сообщения будет выполнена до того, как подписка на событие сообщения будет сохранена в базе данных. Обычно сообщение приходит, когда задача отправки все еще выполняется.

Один из способов избежать этого - создать подписку на сообщения параллельно с отправкой события:

O -- + -- ( M ) -- + -- O
     |    send     |
     `----( M ) --´
         receive
person Jörn Horstmann    schedule 16.03.2017

Что касается данного сообщения об исключении, которое:

org.camunda.bpm.engine.MismatchingMessageCorrelationException: Cannot correlate message 'ReceiveAmsharedResponse': No process definition or execution matches the parameters

Я предполагаю, что вы коррелируете сообщение с именем ReceiveAmsharedResponse, но вы определили сообщение с другим именем для своей ReceiveTask.

Изменение определения вашего сообщения на следующее должно работать:

<bpmn2:message id="Message_06nl07f" name="ReceiveAmsharedResponse" />
person Zelldon    schedule 13.03.2017

Предположим, ваш процесс выглядит примерно так:

O -- ( M ) -- ( M ) -- O
     send    receive

Эта ошибка означает, что response было received раньше, чем request было sent. И под sent я имею в виду всю транзакцию процесса send-request.

Другими словами, из-за быстрого ответа в базе данных Camunda нет зафиксированной транзакции для процесса send-request. Таким образом, когда camunda обрабатывает процесс response-received, невозможно сопоставить response-received с send-request.

Одно из предлагаемых решений - использовать Async Continuations, который предлагает Camunda, и вы можете проверить их официальный сайт. В частности, вы можете использовать Async Before на уровне send-request:

( M ) 
 send   

Async Before сохранит транзакцию в базе данных Camunda до начала send-request процесса. Τ Следовательно, будет возможно, что response будет коррелирован.

person CodeSlave    schedule 15.09.2020