我遇到的情况是,传递到JobExecutionListener.afterJob()
方法的作业状态具有FINISHED
作业执行状态,但是当我在批处理db中检查相同的JobExecution
时schema我发现作业状态仍设置为RUNNING
。
我需要他们两个同步。
有没有办法有这个?我可以使用JobRepository直接在afterJob()方法中使用传递的JobExecution实例安全地更新批处理数据库吗?对此有任何副作用吗?
答案 0 :(得分:0)
从SpringBatch source code,我可以看到在那里更新此状态应该没问题。
然而,我个人的意见是,当我们直接修改框架的数据时,我们应该尽量避免这种情况。
我们无法知道SpringBatch之后可能会带来哪些变化,以及它可能带来什么样的副作用。
答案 1 :(得分:0)
您所看到的是作为听众方法的正确行为 -
一旦作业在内存中完成,JobExecutionListener.afterJob()
就会被挂钩,但是存储库尚未针对最终作业状态进行更新。
在该方法中需要提供正确的状态,因为通常会根据该状态执行一些后处理类型的逻辑 - 例如释放一些资源,发送一些电子邮件等。
将状态更新到存储库是最后的事情,而您可能希望将存储库中的状态改为其他东西(基于某些条件),就像我一样,
if (zeroRead) {
jobExecution.setExitStatus(ExitStatus.COMPLETED);
return;
}
如果读者在阅读时没有找到任何记录,框架会将作业状态标记为FAILED
,而这对我来说是完全正常的情况。
即使您从那里更新状态,框架仍会尝试再次更新,因此会有重复。
即使自己更新存储库不是一个好主意,但我想你需要解释更多 - 我需要它们两个同步以更好地了解你的需求。