SpringBatchのStepの多重実行 その1

■ Step
interfaceのStepをCtrl+Tすると、AbstractStepってクラスがいて、
FlowStep, JobStep, PartitionStep, TaskletStepってのがいます。
JobStepはシンプルに実行するだけっぽいので、
多重実行っぽい名前のPartitionStepを見ていくことにします。
 
■ PartitionStep
Splitterっていう分割用なアレを渡して実行すると、パラレルに流れてくれそうです。
全部のスレッドが終わるまでまって、それぞれの結果が格納されたコレクションで帰ってくる。

// Wait for task completion and then aggregate the results
Collection executions = partitionHandler.handle(stepExecutionSplitter, stepExecution);

PartitionHandlerのhandleメソッドでその辺が実装されてそうですので続きを見ていきます。
 
■ PartitionHandler
これもインターフェースで、Ctrl+Tすると、
TaskExecutorPartitionHandlerってヤツが出てきます。
XMLにgridSizeってプロパティで指定した値を使って分割しそうです。
ってことで分割してるとこを見ていきます。
 
■ StepExecutionSplitter
こいつもインタフェースで実装はSimpleStepExecutionSplitterがやってます。
splitメソッドの中で、getContextsって形で分割して取ってくるようです。
この中ではファイルやDBの中身をボッコリ、オブジェクト作ってContextに乗っけちゃう~
とかっていう痛い感じではなく、StreamをサポートするItemReaderが、
いい感じでExecutionContextにセットしてくれそうです。
ここはキモなところな感じもしますし、ファイルやらJDBCやらHibernateやらiBATISやら
っていろんなのが絡んでくるところなので、別途時間確保して読み進めるとします。
で、TaskExecutorPartitionHandlerに戻って、、
 
■ TaskExecutorPartitionHandler
java.util.concurrent.Future とか FutureTaskとかってのが出てくるんですが、
存在そのものを知りませんでした。
明日J2SE5.0 虎の穴のConcurrency Utilitiesのところ読んで勉強します。。
生成したTaskを元にtaskExecutorが実行~みたいになってるのですが、
JobLauncherの時はRunnableだったのに、こっちはなんでCallableなんだ?とか。
さすがにマルチスレッドなところ不勉強すぐる。俺。。orz
今までコピペでしか書いてこなかったもんな。。。汗
ちなみに、このクラスのexecutorは SyncTaskExecutor です。
 
=====
 
こういうソース読んでくと勉強になるなぁ。
自分の不勉強がエラいこっちゃな感じなので、明日ググりつつ読み進めていきます。
習得するのも大変そうなフレームワークだけど、型にハメて後々楽出来るように。。

コメント

タイトルとURLをコピーしました