【问题标题】:Spring-batch Sharing data between executionsSpring-batch 在执行之间共享数据
【发布时间】:2014-01-15 14:29:58
【问题描述】:

我是 Spring-batch 的新手。我有一个简单的概念验证工作,它做了一些虚拟的事情。

ItemReader:获取 dateA 和 max date 之间的记录数(此时的最后一条记录) ItemProcessor:聚合每个城市的行数 ItemWriter:将结果写入数据库

我的问题是,当作业完成时,我想保留最后一个日期,以便下一个作业执行从该日期开始作为 dateA。我知道我可以使用 JobExecutionContext 来共享数据,但如果在第二次运行时,我试图获取 dateA 但值为 null

有没有办法从上一个作业执行中获取上一个 dateA 值?以及如何?

提前致谢

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    以下可能是替代方案。

    使用 JobExecutionListener#afterJob 将日期存储在 bean holder 中。以下链接回答了在 Step 级别传递集合。

    What's the best way to pass a huge collection to a Spring Batch Step?

    【讨论】:

      【解决方案2】:

      有多种实现方式。最简单的方法是将其写入文件并在下次启动时读取该文件。但这有点脏。您也可以在 DB 中编写它,或者只运行一个 sql,它将从您在 db 中已有的数据中返回最大日期。基本上我会实现一个简单的tasklet(类似Tasklet to delete a table in spring batch),它运行sql并在chunkContext上添加最大数据。

      【讨论】:

      • 您好,谢谢您的回复。问题是数据已经存在,是否有适当的方法来获取已从先前作业执行中更新的值?
      • 只需实现一个简单的 tasklet,如下所示:stackoverflow.com/questions/7834304/… 运行返回最大日期的 sql 并将其添加到 chunkContext
      • 这是一个好方法。我想知道也许我是否实现了一个listerer并添加了类似 beforeJob 来检索值和 afterJob 来为下一个操作保留新值。我的问题是这是否属于同一笔交易?与写操作?谢谢
      • 关于交易的idk;我更喜欢 tasklet,但我很确定你也可以使用 beforeJob 和 afterJob 来实现
      • 做了一些研究,默认情况下,tasklet 的执行方法是事务性的。更多在这里:javabeat.net/transaction-management-in-spring-batch-components
      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2014-02-02
      • 2019-07-02
      • 2011-01-13
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      相关资源
      最近更新 更多