2011-06-30 8 views
0

私はSpring Batchを使用しており、SimpleAsyncTaskExecutorを使用して実行されるタスクレットを作成しました。このステップでは、私はSpringバッチのマルチスレッドステップでのStepExecutionContextへの書き込み

タスクレットの処理方法において
@BeforeStep 
public void saveStepExecution(StepExecution stepExecution) { 
    this.stepExecution = stepExecution; 
} 

StepExecutionContextを取得しています、私はコンテキストを更新しよう:

stepExecution.getExecutionContext().put("info", contextInfo); 

これはstepExecutionConcurrentModificationException秒につながります。 これらを回避し、このマルチスレッド環境でコンテキストを更新するにはどうすればよいですか?

+0

もっと情報を提供してください。どのスプリングバッチバージョンとタスクレット実装のソース –

+0

SpringBatch 2.1.8。この質問に答えるために必要な実装の詳細は何ですか? – tobiasbayer

+0

'RepeatStatus execute(StepContribution contribution、ChunkContext chunkContext)'を実装する必要がある 'org.springframework.batch.core.step.tasklet.Tasklet'でタスクレットを実装していて、chunkContext内に変更可能なstepExecutionContextがある場合は、 BeforeStep Annotationを使用してstepExecutionを取得すると、「タスクレット」の見た目がわからない場合や、「タスクレット」の場合でも、 –

答えて

0

ステップ実行コンテキストは共有リソースです。あなたは本当にスレッドごとに1つの "情報"を入れようとしていますか? Springのバッチではなくスレッドの問題であるため、コンテキストに応じて、これを解決する方法はたくさんあります。

1)スレッドごとに1つの情報がある場合は、スレッドにコンテキストにthreadlocal(1回)を設定し、スレッド情報を格納するためにthreadlocalを使用します。

2)コンテキスト情報が "グローバル"の場合、putを同期ブロックに入れ、その存在を確認してから置く必要があります。

これが役に立ちます。

関連する問題