簡體   English   中英

Activiti-如何同步用戶任務

[英]Activiti - How to synchronize a User Task

我有一個具有用戶任務部分的Activiti流,如下所示:

流屏

基本思想是“等待通知”用戶任務等待特殊隊列的響應。 但是實際上,一個特定的代碼只是完成任務:

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 Engine會引發Exception(請參閱原因),並且整個流程都會終止。

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。 這將確保您將發出接收任務的信號,並在同一數據庫事務中創建一個新的接收任務,再次准備由下一條消息進行更新。

  • 確保您使用樂觀鎖定異常讓隊列使用者“崩潰”,並確保您與隊列生產者的事務處理會話已回滾或明確要求重新交付,以便根據某些重新交付策略重新傳遞消息。

3)OptimisticLockingException的另一個原因可能是您緩存了舊的/更新的任務,而不是在發出信號之前立即查詢它。 始終這樣做,以免“重用”任何過時的任務或執行對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM