【发布时间】:2013-11-05 11:22:54
【问题描述】:
我们在 Camunda 进程中看到 OptimisticLockingExceptions,场景如下:
该流程由一个用户任务、一个网关和一个服务任务组成。 UserTask 执行
runtimeService.setVariable(execId, "object", out);`.
taskService.complete(taskId);
以下 ServiceTask 使用“object”作为输入变量(不修改它),并且在完成时抛出 OptimisticLockingException。我的问题似乎源于这样一个事实,即taskService.complete() 在刷新 UserTask 中设置的变量之前立即执行 ServiceTask。
我遇到了另一个相关问题,当我在一个 UserTask 中执行 runtimeService.setVariable(Map<Strong, Boolean>) 并尝试访问 Map 的成员作为该 UserTask 之后的网关中的转换守卫时。
我找到了以下文章:http://forums.activiti.org/content/urgenterror-updated-another-transaction-concurrently,这似乎与我的问题有关。但是,我不清楚这是否是(不)想要的行为以及如何从 UserTask 访问 DelegateExecution-Object。
【问题讨论】:
-
您描述的行为不是预期的。
out变量的本质是什么?是实现Serializable的复杂java对象吗? -
这是一个
Serializable,到目前为止,我们可以肯定至少发现了一个错误。 -
代替runtimeService.setVariable && taskService.completeTask,考虑加入两个调用:taskService.completeTask(id, Map)
-
在我们大多数情况下都适用的好主意,但是在一种情况下,我们需要在执行期间和任务完成之前存储变量。这种情况也有机制吗?
-
我无法使用this gist 复制它。你的情况有什么不同?你能提供一个失败的测试用例吗?
标签: java business-process-management camunda