3

これは大変なことですが、前代未聞ではないと思います。

国と人口統計の2つのデータセットがあります。国のデータセットには、国の名前とその人口統計データのIDが含まれています。

人口統計データセットは、国から郊外に至る階層データセットです。

これらのデータセットは両方とも、毎週サードパーティから取得されます。

国ごとに1つずつ、人口統計をファイルに分割する必要があります。

これまでの手順は次のとおりです。1)国をプルする2)人口統計をプルする3)(これは必要です)「国の人口統計をファイルに書き込む」を呼び出す国のデータセットをループします

どういうわけか、現在の国IDを渡すステップを繰り返すことは可能ですか?

編集:PartitionHandlerのサンプルへのリンクを追加

JBristowに感謝します。以下のリンクは、JavaTaskオブジェクトのaddArgumentを使用してパラメーターを渡すためにPartitionHandlerをオーバーライドする方法を示していますが、Springバッチの目標である「ビジネス上の問題に固有」ではなく、開発者による多大な負担のように見えます。 http://www.activeeon.com/blog/all/integration/distribute-a-spring-batch-job-on-the-proactive-scheduler

私はあなたの元のリンクセクション7.4.3でも見ました。入力データをステップにバインドするこれは7.4.2のコンテキストにあります。パーティショナー、これはとてもエキサイティングに見えます

<bean id="itemReader" scope="step"
    class="org.spr...MultiResourceItemReader">
  <property name="resource" value="#{stepExecutionContext[fileName]}/*"/>
</bean>

誰かがこれのサンプルXML構成を使用しているとは思いませんか?

  1. パーティショナー
  2. パーティション内のステップに動的な値を渡す

前もって感謝します。

4

1 に答える 1

12

はい、spring-batch のパーティショニング機能をチェックしてください! http://static.springsource.org/spring-batch/reference/html-single/index.html#partitioning

基本的に、「パーティショナー」を使用して新しい実行コンテキストを作成し、その情報を使用して何かを行うハンドラーに渡すことができます。

パーティショニングは並列化のために作成されましたが、デフォルトの同時実行数は 1 であるため、小さく始めて徐々に増やして、自由に使用できるハードウェアに合わせることができます。各国のデータは他の国に依存していないと想定しているため (少なくとも人口統計のダウンロード段階では)、あなたの仕事は基本的な並列化を利用することができます。

/編集: 例を追加します。

これが私がやっていることです (多かれ少なかれ): まず、XML:

<beans>
  <batch:job id="jobName">
    <batch:step id="innerStep.master">
      <batch:partition partitioner="myPartitioner" step="innerStep"/>
    </batch:step>
  </batch:job>
  <bean id="myPartitioner" class="org.lapseda.MyPartitioner" scope="step">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
    <property name="runDate" value="#{jobExecutionContext['runDate']}"/>
    <property name="recurrenceId" value="D"/>
  </bean>
  <batch:step id="summaryDetailsReportStep">
    <batch:tasklet>
      <batch:chunk reader="someReader" processor="someProcessor" writer="someWriter" commit-interval="10"/>
    </batch:tasklet>
  </batch:step>
</beans>

そして今、いくつかのJava:

public class MyPartitioner implements Partitioner {
  @Override 
  public Map<String, ExecutionContext> partition(int gridSize) {
    List<String> list = getValuesToRunOver();
    /* I use treemap because my partitions are ordered, hashmap should work if order isn't important */
    Map<String, ExecutionContext> out = new TreeMap<String, ExecutionContext>(); 
    for (String item : list) {
      ExecutionContext context = new ExecutionContext();
      context.put("key", "value"); // add your own stuff!
      out.put("innerStep"+item, context);
    }
    return out;
  }
}

次に、通常のステップまたはステップ内のジョブ コンテキストから読み取るのと同じように、コンテキストから読み取るだけです。

于 2012-05-14T22:59:00.987 に答える