Spring batch - 另一个 itemreader 或 Itemprocessor 中的 ItemReader

Spring batch - ItemReader within another itemreader or Itemprocessor

这是我的要求:创建一个批处理作业 1. 从 Discount table 中获取特定搜索条件的折扣计划 2.对于Step1中获取的每个折扣节目, 获取符合折扣计划日期的销售记录 从其他 table 处获取有关销售的更多详细信息 3.将销售记录写入ReportTable 4. 更新折扣 table 状态

3 个我能想到的实现选项是: 选项 1: (a) 创建一个扩展 JdbcCursorItemReader 的 DiscountReader,它根据日期和其他条件获取折扣程序 _ returns 类型为 DiscountObj 的对象。 (b) 创建了一个实现 ItemProcessor 的 SalesProcessor, 使用 SalesReader 和 SalesWriter。 -> SalesReader 应该根据当前的从 salestable 读取记录 折扣对象。 -> SalesWriter 将 SalesReader 获取的日期写入数据库。 (c) 创建 DiscountWriter 以将状态更新为 Discount table.

选项 2: (a) 创建带有 SalesReader 的 DiscountReader(ItemReader in ItemReader 方法。)- 为每个正在读取的 DiscountObj 调用 Salesreader。 (b) 创建 SalesWriter 将 SalesReader 获取的日期写入数据库。

在任何情况下,SalesReader 执行的查询的参数都是动态的,因为它必须从当前的 DiscountObj 中提取。 这些是仅有的两种方法还是有更好的方法?

如果我将 SalesReader 注入 SalesProcessor/DiscountReader,则在使用查询参数设置 preparedstatementsetter 之前调用 open() 方法。

如果我在 SalesProcessor/DiscountReader 中创建 SalesReader 的实例,我得到 Reader 未打开的异常。


选项 3:创建折扣Reader 以阅读折扣。 创建调用 DAO 的 SalesProcessor 以根据 dispuntObj 获取销售记录 将 DAO 返回的数据传递给 writer。

请帮忙。

使 readers、处理器和编写器尽可能分开:每个组件都有特定的工作,混合通常是一种不好的做法。
您的用例很常见,如果我理解正确的话,您的困难与 reader.
有关 将其分成两部分:

  • Reader:使用单个 SQL 基于游标的 reader 基于折扣+销售表之间的联接
  • 处理器:对于每条获取的记录,使用 DAO 来丰富带有附加数据的记录

只要你需要更多的数据操作,就添加更多的处理器,而不是编写应该是直截了当的

这只是一个解决方案;希望你能从中得到启发。干得好:)

我觉得您可以编写一个连接查询,因为一切都基于您之前获取的内容。

如果您需要使用 JobExecutionListenerSupport 的某些信息(请参阅 beforeJob、afterJob)

,您也可以为 reader/writer 编写一个监听器

如果您按照上述操作,这将是 spring 批处理的简单入门用例。