问题描述
我正在创建一个非常通用的Spring Batch应用程序,在该应用程序中,我从YAML文件中读取了许多配置,并动态创建了作业并注册了以下作业,
jobRegistry.register(new ReferenceJobFactory(job));
所有这些操作都在配置类中完成。之后,我启动以下所有工作,
jobs.forEach(j -> {
Job job;
try {
job = jobRegistry.getJob(j);
JobExecution jobExecution = jobLauncher.run(job,jobParameters);
jobExecutions.add(jobExecution);
} catch (Exception e) {
e.printStackTrace();
}
});
一切正常,直到此处,所有作业均成功执行并完成,并且JobRepository也更新为“ COMPLETED”状态。之后,Spring Batch应用程序将继续运行,并且不会退出。一旦完成所有工作,我不知道如何退出spring batch应用程序。
我从其他一些话题开始做下面的事情,
ConfigurableApplicationContext run = SpringApplication.run(ChpCgmsReplicationApplication.class,args);
System.exit(SpringApplication.exit(run));
这有效,但是问题是它不等待所有作业,完成后的第一个作业,应用程序退出。我该如何等待所有作业完成然后退出。
解决方法
问题spring boot running jobs on startup feature可以解决吗?如果您的工作被声明为Spring bean,则可能是问题的原因。
,从根本上讲,Spring Batch如何知道“所有工作都已完成”?您已动态注册了作业,因此有可能仍要注册更多。
您可以等到根据您的代码完成所有必需的作业,然后关闭应用程序,例如:applicationContext.close()
。如何跟踪所有作业的完成时间将取决于作业的运行方式,但这可能与计数器或CountDownLatch一样简单。
类似这样的东西
int jobsCount = ...
CountDownLatch doneSignal = new CountDownLatch(jobsCount);
jobs.forEach(j -> {
// ...
doneSignal.countDown();
});
ConfigurableApplicationContext run = SpringApplication.run(...);
doneSignal.await();
SpringApplication.exit(run);