2

パーティション指向のジョブを実行しようとしていますが、stepExecutionContextに保存されているデータにアクセスできません。これが私の仕事の定義です

<batch:job id="job1" restartable="false" incrementer="idIncrementer">
    <batch:step id="readwritestep" next="partitionStep">
        <batch:tasklet transaction-manager="transactionManager">
            <batch:chunk reader="reader1"
                         writer="writer1"
                         commit-interval="500"/>
        </batch:tasklet>
        <batch:listeners>
            <batch:listener ref="promotionListener"/>
        </batch:listeners>
    </batch:step>
    <batch:step id="partitionStep" >
        <batch:partition step="detailsStep" partitioner="partitioner">
            <batch:handler grid-size="10" task-executor="taskExecutor" />
        </batch:partition>
    </batch:step>
</batch:job>
<batch:step id="detailsStep">
    <batch:tasklet transaction-manager="transactionManager">
        <batch:chunk reader="reader2"
                         processor="processor"
                         writer="writer2"
                         commit-interval="1500"/>
    </batch:tasklet>
</batch:step>

readwritestepを処理している間、partionerでアクセスできるように、いくつかのデータをstepコンテキストに格納し、jobコンテキストにプロモートしています。しかし、私が実装したカスタムパーティショナーには、保存されたデータにアクセスできる親ステップへの参照がありません...パーティショナーがSTEPにバインドされていても、親ステップデータにアクセスできません...ここで何かが不足していますか?パーティショナーが提供しているオプションの1つは、私が興味を持っていないスプリッターコンテキストを生成するjdbctemplateです。コンテキストデータにアクセスするために@beforestepアノテーションを挿入しようとしましたが、呼び出されませんでした。スレーブデータを生成するためにJDBC読み取りを実行したくありません...ステップに格納されたLISTデータを取得したい/ジョブコンテキストの実行とスプリッターコンテキストの生成...誰かが私を正しい方向に向けて、そのデータにアクセスできるようにするのを手伝ってくれませんか...

これがパーティショニングクラスです...

     public class ProductDetailsPartitioner implements Partitioner {

     private List<Product> prds;


      @Override
      public Map<String, ExecutionContext> partition(int gridSize) {
       List<String> referencIds = new ArrayList<String>();
       for (Product prd : prds) {
        referencIds.add(prd.getReferenceId());
       }
       Map<String, ExecutionContext> results = new LinkedHashMap<String,ExecutionContext>();
      for (String referencId : referencIds) {
        ExecutionContext context = new ExecutionContext();
        context.put("referenceId", referencId);
        results.put("partition." + referencId, context);
      }
        return results;
    }

     @BeforeStep
     public void retrieveInterstepData(StepExecution stepExecution) {
           System.out.println("Entered Before step in partion");
           JobExecution jobExecution = stepExecution.getJobExecution();
           ExecutionContext jobContext = jobExecution.getExecutionContext();
           System.out.println("ExecutionContext"+jobContext);
           this.prds = (List<Product>) jobContext.get("products");

     }
  }
4

1 に答える 1

0

OK、別のアプローチをとることで、この問題をパスすることができました。現在、実行コンテキストを介して参照を渡すのではなく、ジョブ ID に基づいてパーティショナーを処理しています。正常に動作しています。実際のビジネスニーズに基づいているため、実際のソリューションを説明するのは困難です。

于 2013-02-09T00:17:24.843 に答える