跳到主要内容
版本:6.0.2

复用现有服务

DeepSeek V3 中英对照 Reusing Existing Services

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

以下 Java 示例使用了 ItemReaderAdapter

@Bean
public ItemReaderAdapter itemReader() {
ItemReaderAdapter reader = new ItemReaderAdapter();

reader.setTargetObject(fooService());
reader.setTargetMethod("generateFoo");

return reader;
}

@Bean
public FooService fooService() {
return new FooService();
}

需要注意的一点是,targetMethod 的契约必须与 read 的契约相同:当数据耗尽时,它返回 null。否则,它返回一个 Object。任何其他情况都会阻止框架知道处理何时结束,这可能导致无限循环或不正确的失败,具体取决于 ItemWriter 的实现。

以下 Java 示例使用了 ItemWriterAdapter

@Bean
public ItemWriterAdapter itemWriter() {
ItemWriterAdapter writer = new ItemWriterAdapter();

writer.setTargetObject(fooService());
writer.setTargetMethod("processFoo");

return writer;
}

@Bean
public FooService fooService() {
return new FooService();
}