重用現有服務
批次系統經常與其他應用程式風格結合使用。最常見的是線上系統,但也可能透過移動每個應用程式風格使用的必要大量資料,來支援整合或甚至是胖客戶端應用程式。因此,許多使用者希望在其批次 Job 中重用現有的 DAO 或其他服務是很常見的。Spring 容器本身透過允許注入任何必要的類別,使這件事變得相當容易。然而,在某些情況下,現有的服務可能需要充當 ItemReader
或 ItemWriter
,以滿足另一個 Spring Batch 類別的依賴關係,或者因為它確實是 Step 的主要 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.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
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.item.adapter.ItemWriterAdapter">
<property name="targetObject" ref="fooService" />
<property name="targetMethod" value="processFoo" />
</bean>
<bean id="fooService" class="org.springframework.batch.item.sample.FooService" />