我们在大多数项目中一直使用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
答案 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
比response
早received
早request
。
sent
是指sent
流程的整个事务。
因此,换句话说,由于响应速度快,Camunda数据库中没有用于send-request
进程的已提交事务。因此,当camunda处理send-request
处理时,不可能将response-received
与response-received
关联起来。
一个建议的解决方案是使用Camunda提供的send-request
,您可以签入他们的official website。更具体地说,您可以在Async Continuations
级使用Async Before
:
send-request
( M )
send
将在Async Before
过程开始之前将事务保存在Camunda数据库中。因此,send-request
可能是相关的。