我们有多个spring batch job
。但每个都需要单独启动。
有没有办法在春天创建一个Master Job
或any controller
,负责执行所有其他批处理作业?因此,我们只需要执行主作业,而所有其他作业都自动启动。
答案 0 :(得分:4)
我刚刚在this question上解释了如何在单独的上下文中加载所有作业来启动spring应用程序。我们有重启作业,每10分钟安排一次,它会检查最新的失败执行情况,并尝试重启几次。
您的用例几乎相同,您可以使用自己的配置文件在不同的上下文中定义所有作业,在配置中,您可以通过设置spring.batch.job.enabled: false
告诉spring批次不要在启动时运行它们,您可以编写自己的启动器使用JobExplorer
为你开始工作,你可以安排它或什么。
类似的东西:
@Component
@EnableScheduling
public class AllJobLauncher {
@Autowired
JobExplorer jobExplorer;
@Autowired
private JobLauncher jobLauncher;
@Autowired
private JobRegistry jobRegistry;
@Scheduled(cron = "${some.cron:0 0/10 * * * ?}")
public void launchAllJobs() throws JobExecutionException {
final List<String> jobNames = jobExplorer.getJobNames();
for (final String jobName : jobNames) {
final Job job = jobRegistry.getJob(getJobName(organizationId));
final JobParameters jobParameters = new JobParametersBuilder() //build parameters
jobLauncher.run(job, jobParameters);
}
}
请注意,春季批次中的JobLauncher
默认为同步,因此启动器将等到作业完成。如果要启动作业异步,则必须将此配置放在某处:
@Bean
public JobLauncher jobLauncher() {
final SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
final SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
jobLauncher.setTaskExecutor(simpleAsyncTaskExecutor);
return jobLauncher;
}