【问题标题】:Best approach to chain two jobs one after another using Spring Batch使用 Spring Batch 依次链接两个作业的最佳方法
【发布时间】:2015-03-16 21:28:36
【问题描述】:

我有两份工作(Job1,Job2) Job2 依赖于 job1 的结果,所以它必须等到 job 1 完成

我需要以某种方式将它们链接起来:

  1. 当 job1 完成后,它需要调用 job2。怎么做?到底用tasklet哪个会调用job2?

  2. 另一种方式可能是调用者(它是一些调度程序服务)将负责在 job1 返回后立即调用 job2 - 这不是很好,因为不需要同步调用 job1。

您将如何使用 Spring Batch 实现两个链接(和依赖的作业)?

谢谢。

【问题讨论】:

标签: java spring scheduled-tasks spring-boot spring-batch


【解决方案1】:

您可以使用JobStep 从第一个作业中启动第二个作业。见5.3.6 Externalizing Flow Definitions and Dependencies Between Jobs

【讨论】:

  • 啊,这可能会起作用。但是您认为我应该以这种方式链接作业还是将责任委托给调度程序?
  • 这取决于您希望它们如何运行。如果您需要它们独立(在不同的线程中运行),那么您必须找到一种方法来持久化第一个作业的输出以由第二个作业处理。如果您对它们同步运行感到满意,那么 JobStep 对您来说是一个简单的解决方案。
【解决方案2】:

这是我一个接一个地启动两个(列表)作业的方式:

1- 用@Order 声明两个作业bean

@Order(1) // The first in the List
@Bean(name = "firstJob")
public Job firstJob() { .... }

@Order(2) // Second job to be launched
@Bean(name = "secondJob")
public Job secondJob() { .... }

2- 注入作业列表

@Autowired
List<Job> jobs;

3- 启动它们

    public void run(String... args) {
    JobParameters params = new JobParametersBuilder()
            .addString("JobID", String.valueOf(System.currentTimeMillis()))
            .toJobParameters();
    jobs.forEach(job -> {
        try {
            jobLauncher.run(job, params);
        } catch (Exception e) {
            logger.error("Job {} cannot be executed", job.getName());
            e.printStackTrace();
        }
    });
}

我希望这对阅读这篇文章的新人有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多