1

我想跨运行相同作业的触发器保留重试计数数据。

我尝试将它存储到 JobExectionContext.JobDetails.JobDataMap,这是一个 DirtyHashMap。它会被存储,但是当第二次相同的作业由不同的触发器运行时,如果该触发器更新相同键的值,它不会持续存在。因此,当您第三次访问它时,键值仍然与第一个相同。

注意:当我在 Job 类上使用 @PersistJobDataAfterExecution 正常运行而不是在兵马俑中运行时,它确实有效

这是一个伪代码:

Cron 触发器 1:在 CronTrigger.executionComplete() > 如果失败 > 增加 retryCount 并在 jobcontext JobDataMap 中设置它 > 使用新的 SimpleTrigger 重新安排相同的作业(在上下文 0 中重试计数,新值设置为 1)

简单触发器 1:在 SimpleTrigger.executionComplete() 上 > 如果失败 > 增加 retryCount 并在 jobcontext JobDataMap 中设置它 > 使用新的 SimpleTrigger 重新安排相同的作业(上下文 1 中的重试计数,新值集 2)

简单触发器 2:在 SimpleTrigger.executionComplete() > 如果失败 > 增加 retryCount 并在作业上下文 JobDataMap 中设置它 > 使用新的 SimpleTrigger 重新安排相同的作业

(上下文中的重试次数仍为 1,新值设置为 2)

这就是问题所在,重试计数在第一次设置后没有增加。同样,只有在 terracotta jobstore 中运行时才会发生这种情况。在单个实例中完美地坚持。

任何想法?

4

1 回答 1

0

我找到了可能对有类似问题的人有所帮助的解决方案。问题是我的兵马俑版本是 3.5.2,不支持石英 2 及更高版本。所以@PersistJobDataAfterExecution 不起作用。所以我实现了不推荐使用的 StatefulJob 接口,它就像一个魅力!

于 2012-10-25T15:01:41.203 回答