私はSpringBatchを初めて使用し、バッチジョブを実装しようとしています。
StackOverflowでこの質問を調べましたが、受け入れられた主な答えは、基本的に、データベースから2回読み取る2つのステップを実装することでした。
<job id="myJob">
<step id="step1" next="step2">
<tasklet>
<chunk reader="reader" writer="typeAwriter"/>
</tasklet>
</step>
<step id="step2">
<tasklet>
<chunk reader="reader" processor="processor" writer="typeBwriter"/>
</tasklet>
</step>
</job>
MySQLデータベースから2回読み取るよりも効率的な方法はありませんか?たとえば、クエリが非常に大きく、システムパフォーマンスを低下させた場合はどうなりますか?
先に進んで、自分の質問に答えます。これを行うには複数の方法がありますが、最初にプロパティとオブジェクトをに保存し、ステップの完了後にStepExecutionContext
それらを昇格させるとJobExecutionContext
うまくいくことがわかりました。また、ここでかなり徹底的に文書化されています。
ステップ1:
ライター/リーダーでプライベートを宣言しStepExecution
ます。次に、読み取り/書き込みメソッド内でステップコンテキストを作成し、データをキーと値のペアとして配置します。
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("someKey", someObject);
ステップ2:ExecutionContextPromotionListener
ステップのBean構成にを追加します。ExecutionContextPromotionListener
含まれている必要がありますString[]
から、この実装に似て、あなたのステップを超えて仕事の範囲を促進したいキー、含まキーと呼ばれるプロパティのLinkedInの記事を:
@Bean
public ExecutionContextPromotionListener promotionListener() {
ExecutionContextPromotionListener listener = new ExecutionContextPromotionListener();
listener.setKeys( new String[] { "entityRef" } );
return listener;
}
ステップ3:ステップを実行する前に、StepExecutionをライターに追加する必要もあります。
@BeforeStep
public void saveStepExecution( StepExecution stepExecution ) {
this.stepExecution = stepExecution;
}
ステップ4:これにより、write()
メソッドがstepExecution
インスタンスにアクセスできるようstepContext
になり、データを保存するためにアクセスできるようになります。たとえば、あなたは書くことができます
write() {
... // write logic
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("keyYouWantToPutIn", theCorrespondingDataObject);
}
最後に、次のステップで、このデータを取得できます(Spring Batchのドキュメントから直接取得した例:
@BeforeStep
public void retrieveInterstepData(StepExecution stepExecution) {
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
this.someObject = jobContext.get("someKey");
}
この時間は、しかし、予告それからアクセスされているということjobContext
とは対照的に、stepContext
-それが推進されています!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加