2017-01-05 2 views
0

Springバッチpartitioningを実装しましたが、Partitionerのpartition()メソッドからMap<String, ExecutionContext> result = new HashMap<>();を返していました。Springバッチでパーティション化されたステップを注文する

私の要件は、スレーブステップを特定の順序(resultマップへの挿入順序)で開始することであり、これはMapを超えて発生していません。

私はMap<String, ExecutionContext> result = new LinkedHashMap<>();を使用しようとしましたが、これも有用ではありません。マップからのスレッドはランダムに開始されます。

マスターステップ構成でSimpleAsyncTaskExecutorを実行者として使用しており、concurrencyLimit並列スレッドが開始されています。 concurrencyLimit=1を設定した場合、最初のスレッドをresultマップに挿入して開始するなどしてください。

この注文はどのように実装できますか?

+0

パーティショニングは、ワーカーの実行順序を保証するものではありません。彼らは並行して処理する必要があるので、私はあなたがなぜ必要なのか分からない。なぜ特定の順序で実行する必要があるのか​​を説明できる場合は、代替案を手助けすることができます。 –

+0

基本的には、処理するデータの数が変化する235のクライアントがあります。注文数の多いクライアントを最初に処理する必要があるため、注文が必要です。すべてのクライアントは最終的に処理されますが、スループットを向上させるために最も高いN個のスレッドを最初に開始し、数千のクライアントが数百万のクライアントが終了するのを待っている状況を望んでいません。クライアント。 –

+0

@MichaelMinella:私はパーティーでLinkedHashMapを使用し、Karthik Prasadの答えに示唆されているようにスプリッタを書いています。それは正しいアプローチですか? –

答えて

2

From StepExecutionSplitter#splitをオーバーライドする必要があるかもしれませんが、SimpleStepExecutionSplitterクラスを拡張してSplitメソッドを実装できると思います。分割メソッドでは、StepExecutionをHashSetからLinkedHashSetに変更する必要があります再起動も考慮する必要がある場合は、getContextsメソッドの変更も考慮する必要があります。

以下は、スプリッタを追加するスニペットです。

stepBuilders.get("partitionStep") 
       .partitioner(slaveStep) 
       .partitioner("myParitionerStep", partitioner) 
       .taskExecutor(new SimpleThreadPoolTaskExecutor()) 
       .splitter(new SimpleStepExecutionSplitter(jobRepository, allowStartIfComplete, stepName, partitioner)) 
       .build() 
+0

か、 'doHandle()'メソッドをオーバーライドして 'org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler'に似たパーティションハンドラを提供し、' .partitionHandler(partitionHandler) 'の手順に従う必要がありますか?パーティションハンドラは、起動スレッドと呼び出しスプリッタです。 –

+0

doHandleというコードがhandleによって呼び出された場合は、splitterを使用してhandleメソッドですべてのstepExecutionを取得すると、これらのstepExecutionsが順番に必要になります。したがって、スプリッタを変更する必要があります。 –

関連する問題