多个Spring Batch作业写入同一个平面文件

时间:2015-07-20 18:56:37

标签: java spring-batch

我有几个不同的Spring Batch作业需要写入同一个平面文件。在平面文件中写出的数据顺序无关紧要。这些批处理作业可能同时运行。

FlatFileItemWriter是否合适?我担心的是,如果同时有多个作业尝试写入平面文件,数据可能会混合在一起。

3 个答案:

答案 0 :(得分:1)

根据documentation,它不是线程安全的。因此,如果您有多个线程写入同一个文件,则必须实现自己的锁定机制。

答案 1 :(得分:0)

由于@dardo编写FlatFileItemWriter不是线程安全的,因此您无法使用多个线程写入同一文件。
与实现自定义锁定机制不同的解决方案可能是写入不同的文件并创建一个新的最后一步,该工作是连接所有以前创建的文件。您可以重复使用原始作业(以创建文件作为步骤)将它们包裹起来JobStep

答案 2 :(得分:0)

您只需使用同步写入方法创建包装器即可。像这样:

public class SynchronizedWrapperWriter<T> implements ItemWriter<T>, ItemStream {

  private ItemWriter<T> itemWriter;
  private boolean isStream = false;

  /**
   * setzen des ItemWriter.
   */
  public void setItemWriter(ItemWriter<T> itemWriter) {
    this.itemWriter = itemWriter;
    if (itemWriter instanceof ItemStream) {
      isStream = true;
    }
  }

  @Override
  public void close() {
    if (isStream) {
      ((ItemStream) itemWriter).close();
    }
  }

  @Override
  public void open(ExecutionContext executionContext) {
    if (isStream) {
      ((ItemStream) itemWriter).open(new ExecutionContext());
    }
  }

  @Override
  public void update(ExecutionContext executionContext) {
  }

  @Override
  public synchronized void write(List<? extends T> items) throws Exception {
    itemWriter.write(items);
  }
}