JobOperator是对JobLauncher的封装,通过作业名字来启动作业,传参格式也变成了query字符串
@Configuration
public class JobOperatorConfig implements ApplicationContextAware {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private JobExplorer jobExplorer;
@Autowired
private JobRepository jobRepository;
@Autowired
private JobRegistry jobRegistry;
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
private ApplicationContext applicationContext;
@Bean
public JobOperator jobOperator() {
SimpleJobOperator jobOperator = new SimpleJobOperator();
jobOperator.setJobLauncher(jobLauncher);
jobOperator.setJobRepository(jobRepository);
jobOperator.setJobExplorer(jobExplorer);
jobOperator.setJobRegistry(jobRegistry);
jobOperator.setJobParametersConverter(new DefaultJobParametersConverter());
return jobOperator;
}
@Bean
public JobRegistryBeanPostProcessor jobRegistrar() throws Exception {
JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
postProcessor.setJobRegistry(jobRegistry);
postProcessor.setBeanFactory(applicationContext.getAutowireCapableBeanFactory());
postProcessor.afterPropertiesSet();
return postProcessor;
}
@Bean
public Job testJob() {
return jobBuilderFactory.get("testJob")
.start(testStep1())
.build();
}
@Bean
public Step testStep1() {
return stepBuilderFactory.get("testStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.err.println("step1 execute finish " + chunkContext.getStepContext().getJobParameters().get("key2"));
return RepeatStatus.FINISHED;
}
})
.build();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
注意:JobOperator和JobLauncher在对待失败的作业重启上是不一样的,JobLauncher可以调用run()
方法对失败的作业可以进行再次运行,而JobOperator中的start()
方法只能用作第一次启动,如果第一次作业失败了,要想重启只能调用restart()
方法。
@RestController
@RequestMapping("/job")
public class JobController {
@Autowired
private JobOperator jobOperator;
@RequestMapping("/start2")
public Long start2() throws Exception {
return jobOperator.start("testJob", "key1=value1,key2=value2");
}
@RequestMapping("/restart")
public Long restart(long executionId) throws Exception {
return jobOperator.restart(executionId);
}
}