3

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();
  }
}
4

2 に答える 2