在afterJob()中更新JobExecution db记录

时间:2017-09-07 22:39:55

标签: java spring-batch

我遇到的情况是,传递到JobExecutionListener.afterJob()方法的作业状态具有FINISHED作业执行状态,但是当我在批处理db中检查相同的JobExecution时schema我发现作业状态仍设置为RUNNING

我需要他们两个同步。

有没有办法有这个?我可以使用JobRepository直接在afterJob()方法中使用传递的JobExecution实例安全地更新批处理数据库吗?对此有任何副作用吗?

2 个答案:

答案 0 :(得分:0)

SpringBatch source code,我可以看到在那里更新此状态应该没问题。

然而,我个人的意见是,当我们直接修改框架的数据时,我们应该尽量避免这种情况。

我们无法知道SpringBatch之后可能会带来哪些变化,以及它可能带来什么样的副作用。

答案 1 :(得分:0)

您所看到的是作为听众方法的正确行为 -  一旦作业在内存中完成,JobExecutionListener.afterJob()就会被挂钩,但是存储库尚未针对最终作业状态进行更新。

在该方法中需要提供正确的状态,因为通常会根据该状态执行一些后处理类型的逻辑 - 例如释放一些资源,发送一些电子邮件等。

将状态更新到存储库是最后的事情,而您可能希望将存储库中的状态改为其他东西(基于某些条件),就像我一样,

if (zeroRead) {
    jobExecution.setExitStatus(ExitStatus.COMPLETED);
    return;
 }

如果读者在阅读时没有找到任何记录,框架会将作业状态标记为FAILED,而这对我来说是完全正常的情况。

即使您从那里更新状态,框架仍会尝试再次更新,因此会有重复。

即使自己更新存储库不是一个好主意,但我想你需要解释更多 - 我需要它们两个同步以更好地了解你的需求。