gpt4 book ai didi

java - Activiti - 如何同步用户任务

转载 作者:行者123 更新时间:2023-11-30 04:01:29 26 4
gpt4 key购买 nike

我有一个 Activiti 流程,其中有一个用户任务部分,如下所示:

Flow Screen

基本思想是“等待通知”用户任务等待来自特殊队列的响应。但实际上,特定的代码只是完成任务:

Map<String, Object> variables = new HashMap<String, Object>();
variables.put("KEY", variable);

String assignee = variable.getAssignee();
processService.completeTask(assignee, variables);

所以我的问题是负责此代码的服务可以从该队列接收多个响应。这就是我想要的行为(队列可以返回类似 Message_Processed 的内容,并在几毫秒后返回 Message_Send)。但是,当第二个响应到来时,Activiti 引擎会抛出异常(请参阅原因),整个流程就会终止。

Caused by: org.activiti.engine.ActivitiOptimisticLockingException: Task[id=3867, name=Wait for Notification] was updated by another transaction concurrently

所以我正在寻找:有没有一种方法可以完成一项任务,以某种方式它将接受并吞下所有响应而不抛出异常。

最佳答案

我看到以下几点:

1) 您可能想查看 Activiti 接收任务。这实际上更适合等待继续进行的信号到达:http://www.activiti.org/userguide/index.html#bpmnReceiveTask

2) 您可能会收到 OptimisticLockingException,因为您的更新“太快”且同时进行。在这里我看到了选项

  • 您以某种方式配置队列使用者,以便它可以仅以单线程独占方式从队列接收消息。然后,您还应该确保后续的“Update MessageVO”服务任务以及接收任务标记为 async=true。这将确保您向接收任务发出继续进行的信号,并在同一数据库事务中再次创建一个新的接收任务,准备好由下一条消息更新。

  • 让队列使用者因乐观锁定异常而“崩溃”,并确保与队列生产者的事务 session 已回滚或显式请求重新传递,以便根据某些重新传递策略重新传递消息.

3) OptimisticLockingException 的另一个原因可能是您缓存了旧的/更新的任务,而不是在发出继续信号之前立即查询它。始终这样做,这样您就不会“重用”任何过时的任务或执行对象

关于java - Activiti - 如何同步用户任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21903076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com