DB から読み取っているマルチスレッドのバッチ ジョブがあり、Spring バッチでは ItemReader がスレッド セーフではないため、レコードを再読み取りするさまざまなスレッドが心配です。私はSpringBatch FAQセクションを調べました
read() メソッドを同期できます (たとえば、同期を行うデリゲーターでラップすることにより)。再起動可能性が失われることに注意してください。そのため、ステップを再起動不可としてマークし、安全 (かつ効率的) にすることをお勧めします。リーダーで saveState=false を設定することもできます。
この場合、なぜ再始動可能性が失われるのか知りたいですか? 再起動可能性は、読み取り操作の同期とどのような関係がありますか? いつでも再試行できますよね?また、このコードはリーダーを同期するのに十分でしょうか?
public SynchronizedItemReader<T> implements ItemReader<T> {
private final ItemReader<T> delegate;
public SynchronizedItemReader(ItemReader<T> delegate) {
this.delegate = delegate;
}
public synchronized T read () {
return delegate.read();
}
}