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 批处理的简单入门用例。
这是我的要求:创建一个批处理作业 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 批处理的简单入门用例。