跳到主要内容

项读取器和项写入器

QWen Plus 中英对照 ItemReaders and ItemWriters

所有批处理都可以简单地描述为读取大量数据、执行某种计算或转换,并输出结果。Spring Batch 提供了三个关键接口来帮助进行批量读取和写入:ItemReaderItemProcessorItemWriter

小节摘要

📄️ 委托模式与在步骤中注册

请注意,CompositeItemWriter 是 Spring Batch 中常见的委托模式的一个示例。这些委托本身可能实现了回调接口,例如 StepListener。如果它们确实实现了此类接口,并且作为作业中的步骤的一部分与 Spring Batch Core 一起使用,则几乎肯定需要手动将它们注册到步骤中。直接连接到步骤的读取器、写入器或处理器如果实现了 ItemStream 或 StepListener 接口,则会自动注册。但是,由于委托对步骤来说是未知的,因此需要将它们注入为监听器或流(如果合适的话,可以同时注入为两者)。

📄️ 重用现有服务

批处理系统通常与其他应用程序风格结合使用。最常见的联机系统,但也可能通过移动每种应用程序风格使用的必要批量数据来支持集成甚至厚客户端应用程序。出于这个原因,许多用户希望在其批处理作业中重用现有的 DAO 或其他服务。Spring 容器本身通过允许注入任何必要的类,使得这相对容易。然而,在某些情况下,现有的服务需要充当 ItemReader 或 ItemWriter,无论是为了满足另一个 Spring Batch 类的依赖关系,还是因为它确实是某个步骤的主要 ItemReader。为每个需要包装的服务编写适配器类是相当简单的,但由于这是一个常见的需求,Spring Batch 提供了实现:ItemReaderAdapter 和 ItemWriterAdapter。这两个类通过调用委托模式实现了标准的 Spring 方法,并且设置起来相对简单。

📄️ 防止状态持久化

默认情况下,所有的 ItemReader 和 ItemWriter 实现都会在提交之前将其当前状态存储在 ExecutionContext 中。然而,这并不总是理想的行为。例如,许多开发人员选择通过使用进程指示器来使他们的数据库读取器具备“可重跑性”。通过在输入数据中添加一个额外的列,来指示该数据是否已被处理。当某个特定记录被读取(或写入)时,已处理标志会从 false 转变为 true。然后,SQL 语句可以在 where 子句中包含一个额外的条件,例如 where PROCESSED\_IND = false,从而确保在重启时仅返回未处理的记录。在这种情况下,最好不存储任何状态(例如当前行号),因为这些状态在重启时是无关紧要的。因此,所有读取器和写入器都包含一个 saveState 属性。