如何创建主作业来处理多个 spring 批处理作业?
How to create Master Job to process multiple spring batch job?
我们有多个spring batch job
。但是每个都需要单独启动。
有没有办法在 spring 中创建一个 Master Job
或 any 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;
}
我们有多个spring batch job
。但是每个都需要单独启动。
有没有办法在 spring 中创建一个 Master Job
或 any controller
来负责执行所有其他批处理作业?这样我们只需要执行主作业,其他的都自动启动。
我刚刚在
您的用例几乎相同,您可以使用自己的配置文件在单独的上下文中定义所有作业,在配置中您可以通过设置告诉 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;
}