当前位置: 首页 > 知识库问答 >
问题:

多个Spring批处理作业写入同一个平面文件

郭思淼
2023-03-14

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

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

共有3个答案

韦宏扬
2023-03-14

您可以简单地用同步写入方法创建一个包装器。类似于这样:

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);
  }
}
阳勇
2023-03-14

正如@dardo写的FlatFileItemWriter不是线程安全的,所以您不能使用多个线程写入同一个文件。
与实现自定义锁定机制不同的解决方案可能是写入不同的文件并创建一个新的最后一步,该步骤将连接所有以前创建的文件。您可以重用您的原始作业(将文件块创建为步骤)将它们包装在一个Jobstep

祁烈
2023-03-14

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

 类似资料:
  • 我是Spring批处理的新手,目前正在处理一个新的批处理作业。我的批处理作业: 读取器:读取数据库中的记录(即5家公司的员工) 处理器:处理记录 5个writer:过滤并写入每个文件(即A公司的员工在A路径写入A公司文件,B公司的员工在B路径写入B公司文件),最后一个writer将A公司的所有离职员工写入D公司。 任务:将文件保存到数据库中。 目前,我正在使用CompositeItemWriter

  • 我们正试图建立关于如何在大型IT服务中使用Spring Batch的标准,并具有不同的商业利益。 我们可能会有几个属于不同业务领域的批次。我们已经知道其中一些必须从所有批次通用的表中获取一些参数(即Java和COBOL;例如日期参数)。 我们将实现的Spring批处理作业的数量很难评估。没有重写现有COBOL批次的目标,只要有可能,就鼓励连续流程处理。 一些关于概念证明的问题不时出现,但目前几乎没

  • 我有从多个文件读取并写入多个文件的Spring批处理配置。是否可以只写入从多个读取的一个文件。假设我收到巨大的XML文件,我将XML拆分为小文件并使用分区器并行读取小文件。但我需要将从不同的小xml文件读取的所有数据写入一个输出文件。Spring批处理是否可以做到这一点?我知道通过使写入器同步是可能的,但我正在寻找任何其他可能的方式作业配置 我得到错误组织。springframework。一批项目

  • 我目前正在编写spring batch,在这里我读取一个XML数据,对其进行处理,然后将处理结果作为< code>map传递 生成用于编组和解组的JAXB xjc类。JAXB生成的类如下所示。 JAXB员工类 Spring XML配置文件 处理器和写入器: 问题: XML文件对于每个固定的提交间隔都是重写的,很明显,XML文件是在每个提交级别之后创建的。但我必须附加所有

  • CompositeItemWriter:当我需要将项目平均地分给Writer时,似乎会将所有读取的项目传递给所有的Writer。 BacktoBackPatternClassifier:我并不真正需要分类器,因为我是均匀地拆分项目。 有没有另一种方式,让一个读者和多个作者? 或者我可以在Writer中手动创建线程?

  • 不管模式如何,一个基于JobParameters的同步使用不同读取器的解决方案将会很有帮助。