web-dev-qa-db-ja.com

春のステップ間で情報を渡しますか?

私はSpring Batchを作成しようとしていますが、それを使った経験がありません。

各バッチステップから情報を渡すことは可能ですか、それとも完全に独立している必要がありますか?

たとえば私が持っている場合

   <batch:step id="getSQLs" next="runSQLs">
        <batch:tasklet transaction-manager="TransactionManager"
            ref="runGetSQLs" />
    </batch:step>

    <batch:step id="runSQLs">
        <batch:tasklet transaction-manager="TransactionManager"
            ref="runRunSQLs" />
    </batch:step>

また、getSQLsは、String型のListを生成するクラスを実行するBeanをトリガーします。 runSQLによってトリガーされるBeanのそのリストを参照することは可能ですか? (「トリガーされた」は正しい用語ではないかもしれませんが、私が何を意味するか知っていると思います)

更新:したがって、getSQLsステップがこのBeanをトリガーします。

<bean id="runGetSQLs" class="myTask"
    scope="step">
    <property name="filePath" value="C:\Users\username\Desktop\sample.txt" />
</bean>

このメソッドを実行するmyTaskクラスをトリガーします。

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

    ExecutionContext stepContext = this.stepExecution.getExecutionContext();
    stepContext.put("theListKey", sourceQueries);

    return RepeatStatus.FINISHED;
}

どういうわけか、stepExecutionを実行メソッドに渡す必要がありますか?

9
user2665166

Spring Batchは、将来のジョブステップへのデータのプッシュをサポートしています。これは、ExecutionContext、より正確にはJobExecutionContextを介して実行できます。ここでは 公式ドキュメントの例 を参照しています。

今後のステップでデータを使用できるようにするには、ステップが完了した後で、データをJob ExecutionContextに「昇格」させる必要があります。 Spring Batchはこの目的のためにExecutionContextPromotionListenerを提供しています。

リスナーは、将来のステップとデータを共有するステップで構成する必要があります。

<batch:step id="getSQLs" next="runSQLs">
    <batch:tasklet transaction-manager="TransactionManager"
        ref="runGetSQLs" />
    <listeners>
        <listener>
            <beans:bean id="promotionListener" class="org.springframework.batch.core.listener.ExecutionContextPromotionListener">
                <beans:property name="keys" value="theListKey"/>
            </beans:bean>
        </listener>
    </listeners>
</batch:step>

<batch:step id="runSQLs">
    <batch:tasklet transaction-manager="TransactionManager"
        ref="runRunSQLs" />
</batch:step>

データは、次のように実行コードブロックから入力する必要があります。

// ...
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("theListKey", yourList);

その後のステップで、このListは、次のように@BeforeStep aで注釈が付けられたポスト計算フックで取得できます。

@BeforeStep
public void retrieveSharedData(StepExecution stepExecution) {
    JobExecution jobExecution = stepExecution.getJobExecution();
    ExecutionContext jobContext = jobExecution.getExecutionContext();
    this.myList = jobContext.get("theListKey");
}
10
tmarwen

Javaの設定方法。

ステップ1:ExecutionContextPromotionListenerの構成

@Bean
    public ExecutionContextPromotionListener executionContextPromotionListener()
    {
        ExecutionContextPromotionListener executionContextPromotionListener = new ExecutionContextPromotionListener();
        executionContextPromotionListener.setKeys(new String[] {"MY_KEY"});
        return executionContextPromotionListener;   

    }

ステップ2:ExecutionContextPromotionListenerを使用してステップを構成
@豆

    public Step myStep() {
        return stepBuilderFactory.get("myStep")
                .<POJO, POJO> chunk(1000)
                .reader(reader()                
                .processor(Processor())
                .writer(Writer()
                .listener(promotionListener())
                .build();
    }

ステップ3:プロセッサのデータにアクセスする

    @BeforeStep
    public void beforeStep(StepExecution stepExecution) {
         jobExecutionContext = stepExecution.getJobExecution().getExecutionContext();
         jobExecutionContext.getString("MY_KEY")
    }

ステップ4:プロセッサにデータを設定

@BeforeStep
        public void beforeStep(StepExecution stepExecution) {
            stepExecution.getJobExecution().getExecutionContext().put("MY_KEY", My_value);
        }
3
Niraj Sonawane

ステップ間で情報を渡すためにExecutionContextを使用する場合は、よく考えることをお勧めします。通常、それはジョブが完全に設計されていないことを意味します。 Spring Batchの主なアイデアは、膨大な量のデータを処理することです。障害発生時の不要な作業を減らすためにジョブ/ステップの進行状況に関する情報を格納するために使用されるExecutionContext。ビッグデータをExectionContextに入れることはできません。ステップの完了後、情報を確実に読み取り可能な形式(ファイル、DBなど)にしておく必要があります。このデータは、次のステップで入力として使用できます。単純なジョブの場合は、情報ソースとしてジョブパラメータのみを使用することをお勧めします。

あなたの場合、「runGetSQLs」はステップの良い候補のようには見えませんが、必要に応じて「runRunSQLs」ステップでSpring Beanおよびautowireとして実装できます(これも間違いなくステップの良い候補です)。名前に基づいて、runGetSQLsはItemReaderのように見え、runRunSQLsはItemWriterのように見えます。したがって、これらはステップの一部であり、異なるステップではありません。この場合、情報を他のステップに転送する必要はありません。

2
Pavel