Hemos estado usando la versión camunda 7.4 en la mayoría de nuestros proyectos junto con camunda-bpm-spring-boot-starter 1.1.0.
Tenemos un proyecto en el que, en el flujo de camunda, intentamos publicar un mensaje en un intermediario de mensajes que internamente es consumido por otro sistema y volver a publicar un mensaje nuevo en el mismo intermediario de mensajes. Luego activamos una tarea de recepción para recibir ese mensaje y continuar con el proceso. Para escuchar el mensaje entrante, usamos org.springframework.amqp.core.MessageListener y definimos la correlación de mensajes para receiveTask dentro del método onMessage(). Pero obtenemos el siguiente error al hacerlo.
org.camunda.bpm.engine.MismatchingMessageCorrelationException: no se puede correlacionar el mensaje 'ReceiveAmsharedResponse': ninguna definición de proceso o ejecución coincide con los parámetros
Estamos tratando de averiguar dónde está el problema. ¿Está en la versión de camunda que estamos usando o el problema está en el uso de receiveTask? Probamos todos los enfoques definidos enhttps://docs.camunda.org/manual/7.4/reference/bpmn20/tasks/receive-task/ pero no hubo suerte.
Para el método createMessageCorrelation obtenemos el error anterior. Y para otros métodos obtenemos un NPE ya que los objetos EventSubscription/Execution son nulos.
El uso de la tarea de recepción de flujo de Camunda de muestra es el siguiente:
<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" />Y ejemplo de código de correlación de mensajes:
class XYZ implements MessageListener { onMessage() { runtimeService.createMessageCorrelation("Message") .processInstanceBusinessKey(resourceId) .setVariable(ACTIVITY_RESULT, activityResult) .correlate(); }¿Cualquier ayuda sería apreciada?
Gracias, Viswanath
Suponiendo que su proceso se parece a esto:
O -- ( M ) -- ( M ) -- O send receive Si el mensaje de respuesta se envía muy rápido, es posible que onMessage y la correlación del mensaje se ejecuten antes de que la suscripción al evento del mensaje persista en la base de datos. Básicamente, el mensaje llega mientras la tarea de envío aún se está ejecutando.
Una forma de evitar esto sería crear la suscripción de mensajes en paralelo con el envío del evento:
O -- + -- ( M ) -- + -- O | send | `----( M ) --´ receiveCon respecto al mensaje de excepción dado que es:
org.camunda.bpm.engine.MismatchingMessageCorrelationException: Cannot correlate message 'ReceiveAmsharedResponse': No process definition or execution matches the parameters Supongo que correlaciona un mensaje con el nombre ReceiveAmsharedResponse , pero definió un mensaje con un nombre diferente para su ReceiveTask.
Cambiar la definición de su Mensaje a lo siguiente debería funcionar:
<bpmn2:message id="Message_06nl07f" name="ReceiveAmsharedResponse" />Suponiendo que su proceso se parece a esto:
O -- ( M ) -- ( M ) -- O send receive Este error significa que se received una response "antes" de que se sent la request . Y por sent , me refiero a toda la transacción del proceso send-request .
Entonces, en otras palabras, debido a la rápida respuesta, no hay una transacción confirmada en la base de datos de Camunda para el proceso send-request . Por lo tanto, cuando Camunda procesa el proceso response-received , no es posible correlacionar la response-received con la send-request .
Una solución sugerida es usar Async Continuations asíncronas que ofrece Camunda y puede verificar en su sitio web oficial . Más específicamente, puede usar Async Before en el nivel send-request :
( M ) send Async Before guardará la transacción en la base de datos de Camunda, antes de que comience el proceso send-request . Por lo tanto, será posible que la response esté correlacionada.