私は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を実行メソッドに渡す必要がありますか?
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");
}
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);
}
ステップ間で情報を渡すためにExecutionContextを使用する場合は、よく考えることをお勧めします。通常、それはジョブが完全に設計されていないことを意味します。 Spring Batchの主なアイデアは、膨大な量のデータを処理することです。障害発生時の不要な作業を減らすためにジョブ/ステップの進行状況に関する情報を格納するために使用されるExecutionContext。ビッグデータをExectionContextに入れることはできません。ステップの完了後、情報を確実に読み取り可能な形式(ファイル、DBなど)にしておく必要があります。このデータは、次のステップで入力として使用できます。単純なジョブの場合は、情報ソースとしてジョブパラメータのみを使用することをお勧めします。
あなたの場合、「runGetSQLs」はステップの良い候補のようには見えませんが、必要に応じて「runRunSQLs」ステップでSpring Beanおよびautowireとして実装できます(これも間違いなくステップの良い候補です)。名前に基づいて、runGetSQLsはItemReaderのように見え、runRunSQLsはItemWriterのように見えます。したがって、これらはステップの一部であり、異なるステップではありません。この場合、情報を他のステップに転送する必要はありません。