如何创建主作业来处理多个 spring 批处理作业?

How to create Master Job to process multiple spring batch job?

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

有没有办法在 spring 中创建一个 Master Jobany controller 来负责执行所有其他批处理作业?这样我们只需要执行主作业,其他的都自动启动。

我刚刚在 上解释了如何在单独的上下文中加载所有作业的情况下启动 spring 应用程序。我们有重新启动作业,每 10 分钟安排一次,它检查最近失败的执行并尝试重新启动几次。

您的用例几乎相同,您可以使用自己的配置文件在单独的上下文中定义所有作业,在配置中您可以通过设置告诉 spring 批处理在启动时不要 运行 它们spring.batch.job.enabled: false 你可以编写自己的启动器,它使用 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);
         }
    }

请注意 spring 批处理中的 JobLauncher 默认情况下是同步的,因此启动器将等待作业完成。如果您想异步启动作业,则必须将此配置放在某处:

@Bean
public JobLauncher jobLauncher() {
    final SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);
    final SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
    jobLauncher.setTaskExecutor(simpleAsyncTaskExecutor);
    return jobLauncher;
 }