Reusing Existing Services

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

Java

以下 Java 示例使用了 ItemReaderAdapter

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

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

	return reader;
}

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

以下 XML 示例使用 ItemReaderAdapter

XML Configuration
<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

以下 Java 示例使用 ItemWriterAdapter

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

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

	return writer;
}

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

以下 XML 示例使用 ItemWriterAdapter

XML Configuration
<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" />