我有两个 Spring Batch 作业。让我们假设两个工作被称为
AJob
和BJob
。我想在这两个作业执行成功后做点什么。我试图在两个工作的afterJob
方法中发布kafka消息,消费者检查两个工作的退出状态并执行主要业务逻辑。
然而,主要业务逻辑代码似乎并不总是有效。我在另一篇文章中找到了评论。
JobExecutionListener.afterJob() 一旦作业在内存中完成但存储库尚未针对最终作业状态进行更新。
在这种情况下,最佳做法是什么?我想确保两个作业完全执行,然后做主要的业务逻辑。
@Configuration
class AJobConfiguration() {
@Bean
@JobScope
fun jobExecutionListener(): JobExecutionListener {
return object : JobExecutionListenerSupport() {
override fun afterJob(jobExecution: JobExecution) {
// publish kafka message
}
}
}
}
@Configuration
class BJobConfiguration() {
@Bean
@JobScope
fun jobExecutionListener(): JobExecutionListener {
return object : JobExecutionListenerSupport() {
override fun afterJob(jobExecution: JobExecution) {
// publish kafka message
}
}
}
}
// consumer
@KafkaListener()
fun finishJobs() {
val isAFinished = jobExplorer.getLastJobExecution(JobAInstance).exitStatus.exitCode == ExitStatus.COMPLETED.exitCode
val isBFinished = jobExplorer.getLastJobExecution(JobBInstance).exitStatus.exitCode == ExitStatus.COMPLETED.exitCode
if (isAFinished && isBFinished) {
// do something <- This doesn't works sometimes.
}
}