重用现有服务
批处理系统通常与其他应用程序风格结合使用。最常见的组合是联机系统,但它也可能通过移动每种应用程序风格所需的大量数据来支持集成,甚至支持胖客户端应用程序。出于这个原因,许多用户希望在批处理作业中重用现有的 DAO 或其他服务。Spring 容器本身通过允许注入任何必要的类,使得这一过程相对简单。然而,在某些情况下,现有的服务需要充当 ItemReader
或 ItemWriter
,无论是为了满足另一个 Spring Batch 类的依赖关系,还是因为它确实是某个步骤的主要 ItemReader
。为每个需要包装的服务编写适配器类是比较简单的,但由于这是一个非常常见的需求,Spring Batch 提供了实现:ItemReaderAdapter
和 ItemWriterAdapter
。这两个类都通过调用委托模式实现了标准的 Spring 方法,并且设置起来相对简单。
- Java
- XML
以下 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();
}
以下 XML 示例使用了 ItemReaderAdapter
:
<bean id="itemReader" class="org.springframework.batch.item.adapter.ItemReaderAdapter">
<property name="targetObject" ref="fooService" />
<property name="targetMethod" value="generateFoo" />
</bean>
<bean id="fooService" class="org.springframework.batch.item.sample.FooService" />
需要注意的一个重要点是,targetMethod
的契约必须与 read
的契约相同:当数据读取完毕时,它返回 null
。否则,它返回一个 Object
。其他任何情况都会导致框架无法知道何时应结束处理,这将根据 ItemWriter
的实现,导致无限循环或不正确的失败。
- Java
- XML
下面的 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();
}
下面的 XML 示例使用了 ItemWriterAdapter
:
<bean id="itemWriter" class="org.springframework.batch.item.adapter.ItemWriterAdapter">
<property name="targetObject" ref="fooService" />
<property name="targetMethod" value="processFoo" />
</bean>
<bean id="fooService" class="org.springframework.batch.item.sample.FooService" />