Spring Batch:作业重启的确切方式与执行和上下文有关吗?

时间:2015-09-02 18:14:00

标签: java spring mongodb spring-batch

所以我有一个简单的批处理作业只有一步,它包含一个MongoItemReader来读取MongoDB中的对象,当然是自定义项处理器(现在只是将'isProcessed'布尔标志设置为true),以及MongoItemWriter。

事情是,我希望能够在失败时将我的作业备份到数据库(对于服务器停机等情况),所以我实现了基本上存储JobExecutionStepExecution的Mongo文档, JobInstanceExecutionContext个对象。他们似乎正确地创建了他们各自的对象,因为我能够使用它们来重新启动一个作业(将它们添加到作业存储库之后),但它们从一开始就重新启动,而我希望它们从它们停止的地方开始。

所以我想知道我错过了什么。失败的作业存储数据究竟何时/何地失败?我认为readCountreadSkipCountprocessSkipCount等变量与它有关,但这些变量包含在我的StepExecution文档中(以及其他所有内容) {1}}类有一个'get'方法)。我想当时可能是执行上下文,但对于作业和它的一步都是空的。

1 个答案:

答案 0 :(得分:0)

重新启动作业时,有状态组件(实现ItemStream的组件)在打开调用期间会收到步骤ExecutionContext,允许它们根据上次运行重置状态。然后由组件重置状态,并在处理过程中调用ItemStream#update期间维持状态。

因此,基于上述情况,失败的工作在失败时不会持久存在......它实际上一直坚持工作,因为它的成功。这样,当它失败时,事情应该回滚到最后一个成功点。这导致我...

Mongo不是交易性的。你确定状态是否正确持续?由于这个原因,我们没有基于Mongo的职位库......