重用現有服務
批處理系統通常與其他應用程式樣式結合使用。最常見的是線上系統,但它也可能透過移動每種應用程式樣式使用的必要大容量資料來支援整合甚至厚客戶端應用程式。因此,許多使用者希望在其批處理作業中重用現有的 DAO 或其他服務是很常見的。Spring 容器本身透過允許注入任何必要的類,使得這相當容易。然而,在某些情況下,現有服務需要充當 ItemReader 或 ItemWriter,無論是為了滿足另一個 Spring Batch 類的依賴關係,還是因為它確實是步驟的主要 ItemReader。為每個需要包裝的服務編寫介面卡類是相當微不足道的,但由於這是一個常見的關注點,Spring Batch 提供了實現:ItemReaderAdapter 和 ItemWriterAdapter。這兩個類都透過呼叫委託模式實現了標準的 Spring 方法,並且設定起來相當簡單。
-
Java
-
XML
以下 Java 示例使用 ItemReaderAdapter
Java 配置
@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
XML 配置
<bean id="itemReader" class="org.springframework.batch.infrastructure.item.adapter.ItemReaderAdapter">
<property name="targetObject" ref="fooService" />
<property name="targetMethod" value="generateFoo" />
</bean>
<bean id="fooService" class="org.springframework.batch.infrastructure.item.sample.FooService" />
需要注意的一個重要點是,targetMethod 的約定必須與 read 的約定相同:當耗盡時,它返回 null;否則,它返回一個 Object。任何其他情況都會阻止框架知道何時應結束處理,這可能會導致無限迴圈或不正確的失敗,具體取決於 ItemWriter 的實現。
-
Java
-
XML
以下 Java 示例使用 ItemWriterAdapter
Java 配置
@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
XML 配置
<bean id="itemWriter" class="org.springframework.batch.infrastructure.item.adapter.ItemWriterAdapter">
<property name="targetObject" ref="fooService" />
<property name="targetMethod" value="processFoo" />
</bean>
<bean id="fooService" class="org.springframework.batch.infrastructure.item.sample.FooService" />