使用 Spring Batch 依次链接两个作业的最佳方法

Posted

技术标签:

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

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

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

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

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

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

谢谢。

【问题讨论】:

Calling another job from a processor in 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();
        
    );

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

【讨论】:

以上是关于使用 Spring Batch 依次链接两个作业的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch - 使用相同的作业参数重新运行作业

访问作业参数 Spring Batch

如何将 Spring Batch Cron 作业迁移到 Spring Cloud 任务

Spring Batch作业未结束

Spring Batch 作业状态未在数据库中更新

关于这个 Spring Batch @Scheduled() 注解以及如何手动启动 Spring Batch 作业的一些疑问?