【发布时间】:2016-09-27 17:22:48
【问题描述】:
我们在处理过程中观察到一些奇怪的情况。我们在连接到一个数据库的多集群环境中使用您的引擎。我们的流程定义包含下面给出的 serviceTask:
<serviceTask id="ms" name="ms" activiti:async="true" activiti:delegateExpression="${msDelegate}">
<extensionElements> <activiti:failedJobRetryTimeCycle>R3/PT60M</activiti:failedJobRetryTimeCycle> </extensionElements>
</serviceTask>
任务之前是 timerEvent 等待新月的开始。在本月,我们发现了以下几种情况(这些是来自应用程序节点之一的日志 - 情况发生在一台机器上):
INFO [2016-06-01 00:11:20.949] [,o.a.c.s.S.S.Service ,provideAsyncJobExecutor-7,,,,1] Outbound Message
INFO [2016-06-01 00:11:37.860] [,o.a.c.s.S.S.Service ,provideAsyncJobExecutor-7,,,,1 Inbound Message
WARN [2016-06-01 00:11:37.947] [,.e.LoggingExecuteAsyncRunnable,provideAsyncJobExecutor-7,,,,1] Optimistic locking exception during job execution: 836c28ab-6fc6-11e6-80e5-005056aa1dfc
INFO [2016-06-01 00:11:59.582] [,o.a.c.s.S.S.Service ,provideAsyncJobExecutor-7,,,,1] Outbound Message
INFO [2016-06-01 00:11:59.824] [,o.a.c.s.S.S.Service ,provideAsyncJobExecutor-7,,,,1] Inbound Message
ERROR [2016-06-01 00:11:59.844] [,.e.LoggingExecuteAsyncRunnable,provideAsyncJobExecutor-7,,,,1] Job 836c28ab-6fc6-11e6-80e5-005056aa1dfc failed
步骤说明:
1 First Outbound Message / Inbound Message -> WS 调用成功结束。
2 作业执行过程中乐观锁异常:836c28ab-6fc6-11e6-80e5-005056aa1dfc
3 Outbound Message / Inbound Message -> 与 #1 相同,但以失败结束(因为已经完成)
我的第一个问题 - 第一次 WS 调用后会导致 ActivitiOptimisticLockingException 的原因是什么?我找不到任何显示该作业同时由另一个节点处理的日志。 第二个 - 什么会在这么短的时间内导致第二个 WS 调用,由同一个线程执行?您有什么建议,可能会出现什么问题或我们可以在哪里寻找潜在问题?
Activiti 版本:5.19.0.2
【问题讨论】:
-
当两个(或更多)不同的线程(在同一台机器或不同的机器上)尝试更改相同执行/变量/等的数据时,会发生乐观锁定异常。是否有另一部分流程实例同时运行?您是否碰巧有乐观锁定异常的堆栈跟踪,它应该告诉您异常是针对哪个实体引发的。对于第二点:我猜这是一些默认的等待时间/重试,尽管你设置了 failedJobRetryTimeCycle。如果您可以添加(简化的)流程定义,那将有所帮助。
-
很遗憾,我无法向您发布堆栈跟踪,因为它只是警告消息并且尚未记录。根据我的分析,同一作业的第二次运行是由于在 DB 中等待 async-continue 作业引起的。工作调用的 WS 工作非常缓慢,这可能会导致我们的问题。但对我来说奇怪的是,我们正在使用配置如下的线程池:最大:50 分钟:10 正在使用池中的 20 个数据库连接。您认为这是正确的还是我们应该对此进行调整?很奇怪,那个作业卡了大约 5 分钟。
-
“非常慢”是什么意思。默认情况下,如果一个作业耗时超过 5 分钟,则视为失败/崩溃,作业执行者可以重新拾取该作业。如果超过 5 分钟,则在这种情况下预计会出现乐观锁定异常。
-
我的意思是 WS 调用大约需要 1 分钟,而且那里的流量很大。