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);
    }
}