我正在使用Spring Boot使用Spring Batch开发。

我使用Spring Boot提供的最小配置,并定义了一些Jobs(根本没有XML配置)。但是当我运行应用程序时

SpringApplication.run(App.class, args);

作业以任意顺序顺序执行。

我在@Configuration带注释的类中以这种方式定义作业,其余由Spring完成:
@Bean
public Job requestTickets() {
    return jobBuilderFactory.get(Config.JOB_REQUEST_TICKETS)
            .start(stepRequestTickets())
            .build();
}

如何指示框架按特定顺序运行作业?

编辑:此警告可以提示吗? (也许没事)
2016-12-29 17:45:33.320  WARN 3528 --- [main] o.s.b.c.c.a.DefaultBatchConfigurer: No datasource was provided...using a Map based JobRepository

最佳答案

1.首先通过在 application.properties 中指定spring.batch.job.enabled=false来禁用自动作业启动

2.在主类中,假设主类名为-SpringBatchMain.java,请执行-ApplicationContext ctx = SpringApplication.run(SpringBatchMain.class, args);

这将初始化上下文而不启动任何作业。

3.一旦上下文被初始化,您可以在主类中为此JobLauncher bean执行JobLauncher jobLauncher = (JobLauncher) ctx.getBean("jobLauncher");Autowired,并通过调用jobLauncher.run(job, jobParameters)以特定的顺序依次启动特定的作业。

您可以从在步骤2初始化的上下文中获取特定的job实例。

您始终可以使用任何有序集合将您的工作放在那里并通过迭代该集合来启动工作。

4,只要将JobLauncher配置为同步即可使用上述技术,即主线程等待jobLauncher.run()调用完成,这是jobLauncher的默认行为。

如果已将jobLauncher定义为使用AsyncTaskExecutor,则作业将并行启动,并且不会保持顺序排列。

希望能帮助到你 !!

编辑:

我正在尝试使用Stephane Nicoll指出的@Order批注,它似乎仅对创建作业的有序集合有帮助,并且您可以按此顺序迭代和启动作业。

以下组件为我提供了指定订单中的工作,

@Component
public class MyJobs {
    @Autowired
    private List<Job> jobs;

    public List<Job> getJobs() {
        return jobs;
    }
}

而且我可以做到,只要定义了bean,主类中的MyJobs myJobs = (MyJobs) ctx.getBean("myJobs");
@Bean
    public MyJobs myJobs() {
        return new MyJobs();
    }

我可以遍历myJobs并按@Order注释指定的顺序启动作业。

08-18 10:41