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