Spring Batch 是一个用于批处理应用程序的框架,它提供了丰富的功能来管理和执行批处理作业。默认情况下,Spring Batch 会在作业失败时记录当前步骤的状态,以便在重新启动作业时可以从上次失败的地方继续执行。然而,有时你可能希望作业在重新启动时从头开始执行,而不是从上次停止的地方继续。
Spring Batch 的作业重启机制:
JobRepository
来存储作业的执行状态。如果你希望作业在重新启动时从头开始执行,可以通过以下几种方式实现:
JobParameters
每次启动作业时,传递不同的 JobParameters
可以使 Spring Batch 认为这是一个全新的作业实例。
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step) {
return jobBuilderFactory.get("job")
.start(step)
.build();
}
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, ItemReader reader, ItemProcessor processor, ItemWriter writer) {
return stepBuilderFactory.get("step")
.<InputType, OutputType>chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@SpringBootApplication
public class BatchApplication implements CommandLineRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
JobParameters params = new JobParametersBuilder()
.addString("JobID", String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(job, params);
}
}
JobExecutionListener
你可以实现一个 JobExecutionListener
,在作业开始前删除之前的执行记录。
@Component
public class CustomJobExecutionListener implements JobExecutionListener {
@Autowired
private JobRepository jobRepository;
@Override
public void beforeJob(JobExecution jobExecution) {
jobRepository.removeJobExecutionsByJobName("job");
}
@Override
public void afterJob(JobExecution jobExecution) {
// Do nothing
}
}
然后在你的作业配置中添加这个监听器:
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step, CustomJobExecutionListener listener) {
return jobBuilderFactory.get("job")
.start(step)
.listener(listener)
.build();
}
通过上述方法,你可以灵活地控制 Spring Batch 作业的重启行为,根据具体需求选择合适的策略。
领取专属 10元无门槛券
手把手带您无忧上云