今月リリースされたJava EE 7プラットフォームには,VMwareのSpring Batchプロジェクトから多くを受け継いだ,バッチ処理プログラミングのモデル仕様が含まれている。そのSpring Batch自体も同じく今月,設定のスリム化とデータアクセスの合理化を達成した注目のリリースによって,多くの関心を集めている。
JSR-352としても知られるBatch Application for the Java Platformは,アプリケーション開発者に対して,堅牢なバッチ処理システムの開発モデルを提供する。プログラムモデルの中心となるのは,Spring Batchから借用した開発パターンだ。Reader-Processor-Writerパターンと名付けられたこのパターンでは開発者に対して,Chunk指向の処理標準の採用を推奨している。
Reader-Processor-Writer パターンは,次に示す3ステップの開発者ワークフローに分解される。
- 処理データ (通常は単一レコード) のひとつの Chunk を処理するように設計された ItemReader クラス。
- ビジネスおよびドメインの各ロジックをChunk に結び付ける役目をする ItemProcessror。
- そして最後に,後処理の委託(delegate)と集約(aggredate)を行うための ItemWriter。
JSR仕様では,Job はXMLドキュメントを用いて記述し,その処理ワークフローに複数の Step を定義する。各 Step には,データの Chunk をどのように処理するか,どのような時間間隔定義を登録するか,といったことを記述しなければならない。ワークフロー上の特定の Step に対するさらに複雑な要件については,JSR-352の Batchlet を定義することで処理可能だ。この Batchlet はJSR-352において,Spring Batchの Tasklet に相当するもので,Step を処理するための手段を提供している。
JSR-352では,ジョブのアクセスとコントロールに,Spring Batchのパターンも採用している。 ジョブは JobOperator を通じて起動される。実行結果には JobRepository を通じてアクセスすることができる。Spring Batchでも JobRepository の名称は同じだが,JobOperator は JobLauncher という名前に変更されている。
Spring Batchのジョブ定義の方法と多少違う点として,Java EE 7でアプリケーションを開発する場合には,ジョブのXMLドキュメントをプロジェクトのMETA-INF/batch-jobsディレクトリ下に置く必要がある。Spring Batchであれば,ジョブ設定をSpringアプリケーションコンテキストの任意のファセットに配置して使用することができる。
Java EE 7コンテナのJob XMLではバッファサイズやコミット間隔,チェックポイントのポリシ以外に,Reader, Processor, Writer クラスを具体的に定義する手段でもある。checkpoint-policy にはコミットを扱う方法を記述する。 コミット処理手順の既定値は "item" だが,開発時には "time" を設定することもある。前者の場合にはコミット間隔を処理レコードの数で,後者は秒で指定する。
<job id="myJob" xmlns="http://batch.jsr352/jsl"> <step id="myStep" > <chunk reader="MyItemReader" writer="MyItemWriter" processor="MyItemProcessor" buffer-size="5" checkpoint-policy="item" commit-interval="10" /> </step> </job>
Spring Batchのジョブ設定はJava EE 7とほとんど同じだが,Stepの定義が tasklet ディレクティブで囲われている部分が違う。chunk設定のreader, process, writerという3つの属性には,アプリケーションコンテキスト内にあるBeanのリファレンスを指定する。バージョン2.2.0時点においては,chunk設定のコミット間隔として,コミットを登録する前に処理されなければならない項目数を指定する。
<job id="myJob"> <step name="myStep"> <tasklet> <chunk reader="myItemReader" processor="myItemProcessor" writer="myItemWriter" commit-interval="2" /> </tasklet> </step> </job> <bean id="myItemReader" class="...MyItemReader" /> <bean id="myItemProcessor" class="...MyItemProcessor" /> <bean id="myItemWriter" class="...MyItemWriter" />
Spring Batchでも現在はJSR-352準拠に向けて作業しているが,その仕様を越えて,Springエコシステムとして他のコンポーネントとのシームレスな統合を開発者に提供しようという考えだ。バッチプロセスの場合,Spring Dataを Reader-Process-Writer パターンの Reader インスタンスとして直接利用できるので,開発者はChunkをSpring Dataレポジトリから取り出すことが可能になる。同じく今月公開されたSpring Batchのバージョン2.2.0リリースでは,MongoDBとNeo4Jデータストアのための,Spring Dataを使用した合理的なインターフェースが提供されている。
Readerインターフェースをシンプルにしたことに加えて,Spring Batchの最新リリースでは,バッチ処理機能を簡素化するためのSpringのJava設定の拡張が実現されている。このシンプルな設定を有効にするために必要なのは,@Configurationでアノテートされたクラスに@EnableBatchProcessingアノテーションを設定することだけだ。これによってJobRepositoryやJobLouncherといったバッチ処理機能は,その他の設定を必要とせずに自動的に相互接続されるようになる。
@Configuration @EnableBatchProcessing public class AppConfig { @Autowired private JobBuilderFactory jobs; @Bean public Job job() { return jobs.get("myJob").start(step1()).next(step2()).build(); } @Bean protected Step step1() { ... } @Bean protected Step step2() { ... } }
データ取り出しとコンフィギュレーションに関するSpring Batch 2.2.0の改善に加えて,最新リリースでは,Springフレームワークへの依存性が3.1.2の最小バージョンに対するものへと更新されている。バッチアプリケーションを構築しているSpring開発者がSpring Batchの最新リリースを使用するためには,この最小バージョンに準拠していることが必要になる。