重用現有服務

批次系統經常與其他應用程式風格結合使用。最常見的是線上系統,但也可能透過移動每個應用程式風格使用的必要大量資料,來支援整合或甚至是胖客戶端應用程式。因此,許多使用者希望在其批次 Job 中重用現有的 DAO 或其他服務是很常見的。Spring 容器本身透過允許注入任何必要的類別,使這件事變得相當容易。然而,在某些情況下,現有的服務可能需要充當 ItemReaderItemWriter,以滿足另一個 Spring Batch 類別的依賴關係,或者因為它確實是 Step 的主要 ItemReader。為每個需要包裝的服務編寫一個适配器類別是相當簡單的,但由於這是一個常見的問題,Spring Batch 提供了實作:ItemReaderAdapterItemWriterAdapter。這兩個類別都透過調用委派模式來實作標準 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" />