既存のサービスの再利用

バッチシステムは、他のアプリケーションスタイルと組み合わせて使用されることがよくあります。最も一般的なのはオンラインシステムですが、各アプリケーションスタイルで使用する必要なバルクデータを移動することで、統合やシッククライアントアプリケーションをサポートすることもできます。このため、多くのユーザーがバッチジョブ内で既存の DAO またはその他のサービスを再利用したいと考えるのが一般的です。Spring コンテナー自体は、必要なクラスを注入できるようにすることで、これをかなり簡単にします。ただし、別の Spring Batch クラスの依存関係を満たすため、またはそれがステップのメイン ItemReader であるために、既存のサービスが ItemReader または ItemWriter として機能する必要がある場合があります。ラップが必要なサービスごとにアダプタークラスを作成するのは非常に簡単ですが、これは非常に一般的な関心事であるため、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" />

注意すべき重要な点の 1 つは、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" />