1

私はSpring Batchを使用しており、を使用して実行されるタスクレットを作成しましたSimpleAsyncTaskExecutor. このステップでは、StepExecutionContextwith を取得しています

@BeforeStep
public void saveStepExecution(StepExecution stepExecution) {
    this.stepExecution = stepExecution;
}

タスクレットの処理メソッドでは、コンテキストを更新しようとしています:

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

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

4

1 に答える 1

1

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

1) スレッドごとに 1 つの情報がある場合は、スレッドにスレッドローカルをコンテキストに配置させ (1 回)、スレッドローカルを使用して「情報」を格納します。

2) コンテキスト情報が「グローバル」である場合は、同期ブロックで put を実行し、put 前にその存在を確認する必要があります。

お役に立てれば。

于 2011-07-28T20:51:23.843 に答える