所有作业完成后的春季批处理触发过程



我有一个包含一系列作业的春季批处理应用程序。 我想在所有作业完成后发送电子邮件,但我不确定执行此操作的最佳方法。 我正在考虑的选项是:

  1. 按特定顺序运行作业,并修改最后一个作业的 JobListener,以便它发送电子邮件。 这样做的缺点是,如果将进一步的作业添加到批处理的末尾,它将不起作用。
  2. 添加一个新作业,该作业将发送电子邮件并对作业进行排序,确保此附加作业最后运行。
  3. 是否有任何内置的弹簧批处理构造将在整个批处理完成后触发?

最后一个选项是我的首选解决方案,所以我的问题是,是否有任何 spring-batch 类可以侦听批处理完成(类似于 JobExecutionListenerSupport 或 Step Listener(?

No.我不知道有任何批处理侦听器侦听整个批处理的完成。

我有两个选择给你。两者都可以让您坚持春天。

(1(如果你的应用程序被设计为永久的(即像一个Web服务器(,你可以注入一个自定义jobLauncher,抓住TaskExecutor并等待它的完成(通过简单的计数器来计算来自afterJob函数的回调,或者通过它要求提交所有作业的一定时间 - 不一定启动(。

添加如下所示的配置类:

@Configuration
class JobConfiguration implements InitializingBean {
TaskExecutor taskExecutor;
@Bean TaskExecutor taskExecutor () {
// here, change to your liking, in this example
// I put a SyncTaskExecutor
taskExecutor = new SyncTaskExecutor();
return taskExecutor;
}
@Bean 
public JobLauncher jobLauncher(@Autowired JobRepository jobRepository,
@Autowired TaskExecutor taskExecutor) {
SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setJobRepository(jobRepository);
launcher.setTaskExecutor(taskExecutor);
return launcher;
}
List<Job> jobs; 
// I don't use this in this example
// however, jobs.size() will help you with the countdown latch
@Autowired public void setJobs (List<Job> jobs) {
this.jobs = jobs;
}
@AfterPropertiesSet
public void init () {
// either countdown until all jobs are submitted 
// or sleep a finite amount of time
// in this example, I'll be lazy and just sleep
Thread.sleep(1 * 3600 * 1000L); // wait 1 hour
taskExecutor.shutdown();
try {
taskExecutor.awaitTermination();
} catch (Exception e) {}
finally {
// send your e-mail here. 
}
}
}

(2(如果您的申请在所有作业完成后停止,您只需按照此操作发送电子邮件即可。

为了完整起见,我重复了几行代码:

public class TerminateBean {
@PreDestroy
public void onDestroy() throws Exception {
// send out e-mail here
}
}

我们还必须添加这种类型的 bean:

@Configuration
public class ShutdownConfig {
@Bean
public TerminateBean getTerminateBean() {
return new TerminateBean();
}
}

如果我理解正确,你有一份工作。在这种情况下,您可以使用一系列类型JobStep的步骤(委托给作业(定义封闭作业。然后,您可以在封闭作业上注册JobExecutionListener。一旦所有步骤(即子作业(完成,将调用此侦听器。

有关JobStep的更多详细信息,请访问:https://docs.spring.io/spring-batch/4.0.x/api/org/springframework/batch/core/step/job/JobStep.html

最新更新