如何创建Master Job来处理多个Spring批处理作业?

时间:2015-05-05 08:57:44

标签: java spring spring-batch

我们有多个spring batch job。但每个都需要单独启动。

有没有办法在春天创建一个Master Jobany controller,负责执行所有其他批处理作业?因此,我们只需要执行主作业,而所有其他作业都自动启动。

1 个答案:

答案 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;
 }