2016-12-21 2 views
0

要件は次のようなものがあります。私は春のバッチに新しいので、誰かがこのケースの仕事を作成する際に私を導くことができます。複雑なプロセスを実行する必要のある従属ステップを持つバッチ・バッチ・ジョブ構成

  1. 取得都市
  2. のリストを、それぞれの国のために
  3. 状態のリストそれぞれの状態については
  4. を取得する(たとえば、私は一度に5カ国を読む必要がある)チャンクに国のリストを読みます
  5. a。各都市について、塊の人のリストを取得します(一度に1000レコードを読む必要があります)。
    b。人の情報を処理する
    c。にステップ3からステップ2からステップ3とcityIdにDB

に情報を書くすべての上記の手順が依存しているが、私は2段階にステップ1から国IDを渡す必要があると言う、STATEIDステップ4

ステップ1とステップ4の内部実行は、並行して実行できます。これは別のjvmでも実行できます

答えて

0

あなたはいくつかの選択肢があると思います。まず、org.springframework.batch.item.support.CompositeItemProcessorを見て、これらのプロセスを1つのステップ(http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#chainingItemProcessors)で連鎖させることをお勧めします。

また、プロモーションリスナーを使用してステップ間でデータを共有することもできます(org.springframework.batch.core.listener.ExecutionContextPromotionListener)。これにより、異なるステップを作成し、各ステップでコミット間隔を制御することができます。ここではプロモーションのリスナーのための基本的なXML設定の例です:

<bean id="promotionListener" class="org.springframework.batch.core.listener.ExecutionContextPromotionListener"> 
    <property name="keys"> 
     <util:list> 
      <value>countries</value> 
      <value>states</value> 
      <value>cities</value> 
     </util:list> 
    </property> 
</bean> 

あなたがインターフェイスを実装し、executeメソッドをオーバーライドして、カスタムTasklet経由ExecutionContextにパラメータを追加することができます。上記の例では、3つのリストがプロモーション・リスナーに追加されており、チェーンの下のステップ間で共有することができます。ここで

executeメソッドをオーバーライドする方法の簡単な例です:

@Override 
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { 

    ExecutionContext executionContext = chunkContext.getStepContext().getStepExecution().getExecutionContext(); 

    executionContext.put("countries", /* country list */; 
    executionContext.put("states", /* state list */); 
    executionContext.put("cities", /* city list */); 

    return RepeatStatus.FINISHED; 
} 

あなたはおそらく三つの異なるタスクレットにこれを抜け出すにしたいと思います - あなたのプロセスの各ステップのための1 - と1つのリストあたりを追加しますタスクレット。また、エラーが発生した場合にはRepeatStatusの処理を強化したいと思いますが、これは簡単な例です。

希望に役立ちます!

+0

お時間をいただきありがとうございます。これらのプロセスを1つのステップに連鎖させたくないので、時間がかかることがあります。私は、すべてのステップが並行であることを望みます。はい、私はあなたが言及した第二の選択肢に基づいて試していましたが、私はこのような連鎖プロセスのためのいくつかのサンプルを得ることができません。 – Rajagopal

+0

私はあなたを完全に理解しているかわかりません。最初の例は、カスタムタスクレットの実装を介して実行コンテキストにコンテンツを追加する方法を示しています。これは、CompositeItemProcessorによるプロセスの連鎖とは異なります。あなたのコメントで、あなたは言った: '...私はこのようなチェーンプロセスのサンプルを得ることができません... 'あなたはチェーンプロセスの例を探していますか、または実行コンテキストにコンテンツを追加する詳細については? – adam

0

手順#1から手順#4は、からデータベースを読み込んでいるため、これらの4つの手順は別々の手順を示していますが、これらの4つの手順は1つの手順です。また、問題を機能的に解決するだけでなく、DBのヒット数を減らす必要があります。 (国、州、市)は、あなたの読者が並列スレッドすなわちWHERE COUNTRY = ? AND STATE =? AND CITY = ?内の各トリプル1000のチャンクでデータを読み込む -

あなたは春のバッチ分割あなたはトリプルしてデータを分割アプローチを使用することができます。

Partitionerインターフェイスを実装し、SELECTクエリを実行してGROUP BY COUNTRY,STATE,CITYを実行してトリプレットを作成する必要があります。

その後、あなたはJdbcPagingItemReaderを返し、あなたがPagingQueryProviderWHERE句でPartitionerに移入COUNTRY,STATE,CITY値を使用し、簡単な読者を書きます。

構文@Value("#{stepExecutionContext[...]}"を使用して、パーティション・ロジックから読者にパーティション値を注入する必要があります。

org.springframework.batch.core.partition.support.Partitioner 

あなたは一度にすべてのパーティションを実行するために必要とされることはありません - あなたはマスターのステップを分割するSimpleAsyncTaskExecutorを提供し、適切な値にそのconcurrencyLimitを設定することにより、並列スレッドの数を制御することができます。

次に、プロセッサとライターを作成します。パーティションロジックから値を注入する場合は、ステップ&のステップコンポーネントを@StepScopeにマークする必要があります。

Sample of partitiongですが、xmlベースの設定です。私はJavaベースの設定を好む。

希望すると助かります!

関連する問題