所以我有一个简单的批处理作业只有一步,它包含一个MongoItemReader来读取MongoDB中的对象,当然是自定义项处理器(现在只是将'isProcessed'布尔标志设置为true),以及MongoItemWriter。
事情是,我希望能够在失败时将我的作业备份到数据库(对于服务器停机等情况),所以我实现了基本上存储JobExecution
,StepExecution
的Mongo文档, JobInstance
和ExecutionContext
个对象。他们似乎正确地创建了他们各自的对象,因为我能够使用它们来重新启动一个作业(将它们添加到作业存储库之后),但它们从一开始就重新启动,而我希望它们从它们停止的地方开始。
所以我想知道我错过了什么。失败的作业存储数据究竟何时/何地失败?我认为readCount
,readSkipCount
,processSkipCount
等变量与它有关,但这些变量包含在我的StepExecution
文档中(以及其他所有内容) {1}}类有一个'get'方法)。我想当时可能是执行上下文,但对于作业和它的一步都是空的。
答案 0 :(得分:0)
重新启动作业时,有状态组件(实现ItemStream
的组件)在打开调用期间会收到步骤ExecutionContext
,允许它们根据上次运行重置状态。然后由组件重置状态,并在处理过程中调用ItemStream#update
期间维持状态。
因此,基于上述情况,失败的工作在失败时不会持久存在......它实际上一直坚持工作,因为它的成功。这样,当它失败时,事情应该回滚到最后一个成功点。这导致我...
Mongo不是交易性的。你确定状态是否正确持续?由于这个原因,我们没有基于Mongo的职位库......