camunda中的Receivetask未按预期工作

时间:2017-03-13 10:30:38

标签: spring camunda

我们在大多数项目中一直使用camunda 7.4版本以及camunda-bpm-spring-boot-starter 1.1.0。

我们有一个项目,在camunda流程中,我们尝试将消息发布到消息代理,消息代理在内部由另一个系统使用,并将新消息重新发布到同一消息代理。然后我们触发receiveTask来接收该消息并进一步处理。要收听传入消息,我们使用org.springframework.amqp.core.MessageListener,并在onMessage()方法中定义receiveTask的消息协同关系。但是这样做我们得到的错误

org.camunda.bpm.engine.MismatchingMessageCorrelationException:无法关联消息'ReceiveAmsharedResponse':没有流程定义或执行与参数匹配

我们正试图找出问题所在?它是我们正在使用的camunda版本还是使用receiveTask的问题。我们尝试了https://docs.camunda.org/manual/7.4/reference/bpmn20/tasks/receive-task/中定义的所有方法,但没有运气。

对于方法createMessageCorrelation,我们得到了上面的错误。对于其他方法,我们得到一个NPE,因为EventSubscription / Execution对象为空。

示例Camunda flow receiveTask用法如下:

 <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();
 }

任何帮助将不胜感激?

谢谢, Viswanath

3 个答案:

答案 0 :(得分:2)

假设您的流程如下所示:

while True do
  begin
    Temp := MyFunction(1, 2, 3);
    if Temp <= 0 then Break;
    ShowMessage(IntToStr(Temp));
  end;

如果响应消息的发送速度非常快,则可能会在数据库中保留消息事件预订之前执行O -- ( M ) -- ( M ) -- O send receive 和消息关联。基本上,当发送任务正在执行时,消息到达。

避免这种情况的一种方法是与发送事件同时创建消息订阅:

onMessage

答案 1 :(得分:1)

关于给定的异常消息:

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" />

答案 2 :(得分:1)

假设您的流程如下所示:

const overdue = [{
    "user.employeeId": "10001440",
    "objectives": [
      "Understand the financial indexes."
    ]
  },
  {
    "user.employeeId": "10000303",
    "objectives": [
      "Document preparation & writing skills"
    ]
  },
  {
    "user.employeeId": "10002168",
    "objectives": [
      "Chia ratio setting for Fuze Tea products L11"
    ]
  },

  {
    "user.employeeId": "10002168",
    "objectives": [
      "Brix parameter differences between Processing and Production of Fuze Tea Lemon-Lemongrass standardization"
    ]
  },
  {
    "user.employeeId": "10002168",
    "objectives": [
      "Paramix Line 9 setting parameter standardization"
    ]
  },
];



let newData = overdue.reduce((acc, curr) => {
  if (!acc[curr['user.employeeId']]) {
    acc[curr['user.employeeId']] = curr;
  } else {
    curr.objectives.forEach((item) => {
      acc[curr['user.employeeId']]['objectives'].push(item)
    })
  }
  return acc;
}, {});


console.log(Object.values(newData))

此错误意味着O -- ( M ) -- ( M ) -- O send receive responsereceivedrequestsent是指sent流程的整个事务。

因此,换句话说,由于响应速度快,Camunda数据库中没有用于send-request进程的已提交事务。因此,当camunda处理send-request处理时,不可能将response-receivedresponse-received关联起来。

一个建议的解决方案是使用Camunda提供的send-request,您可以签入他们的official website。更具体地说,您可以在Async Continuations级使用Async Before

send-request

( M ) send 将在Async Before过程开始之前将事务保存在Camunda数据库中。因此,send-request可能是相关的。