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

Spring批处理-将多个文件写入多个目标

支嘉祥
2023-03-14

我是Spring批处理的新手,目前正在处理一个新的批处理作业。我的批处理作业:

  1. 读取器:读取数据库中的记录(即5家公司的员工)
  2. 处理器:处理记录
  3. 5个writer:过滤并写入每个文件(即A公司的员工在A路径写入A公司文件,B公司的员工在B路径写入B公司文件),最后一个writer将A公司的所有离职员工写入D公司。
  4. 任务:将文件保存到数据库中。

目前,我正在使用CompositeItemWriter编写5个文件,它工作了。

<bean id="ComapanyWriter" 
    class="org.springframework.batch.item.support.CompositeItemWriter">
  <property name="delegates">
    <list>
      <ref bean="CompanyAWriter" />
      <ref bean="CompanyBWriter" />
      <ref bean="CompanyCWriter" />
      <ref bean="CompanyDWriter" />
      <ref bean="ResignedEmpWriter" />
    </list>
  </property>
</bean>

然而,我意识到,如果读取器从数据库中检索到50K条记录,每个写入器将循环所有记录,搜索各自的公司员工并写入文件,这总共是5×50K次,是多余的。所以,我担心演出。

我能想到的一些解决办法:

  1. 试图从数据池(项目)中删除写入的记录,这样下一个写入器将循环较少的数据,但似乎不允许这样做?(我得到这个错误java.lang.UnsupportedOperationException)
  2. 将记录拆分为5个列表(companyAList,companyBList等)供每个编写者编写,但我不确定如何实现这一点
  3. 在writer中将记录拆分为5个列表,并使用1个writer写入5个文件,但不确定是否可行。
  4. 将公司ID作为参数传递,这样作业将根据该参数动态地处理和写入文件。此方法需要对4个公司触发4次职务,不能处理所有公司的离职员工。
  5. 现在我正在查看ClassifierCompositeItemWriter,不确定它是否有帮助。

请指教我如何实现上述方法或如何实现批量作业目标。

共有1个答案

李兴安
2023-03-14

ClassifierCompositeItemWriter是一种方法。分类器将对项目进行分类,并将其传递给指定的编写器。这样,每个writer将只接收分配给它的类的项,而不是循环块的所有项。

您可以在这里找到如何使用ClassifierCompositeItemWriter的示例:https://github.com/spring-projects/spring-batch/blob/master/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/classifierCompositeItemWriterTests.java

这里有一个类似的问题,我在这里添加它以供参考:读取平面文件并写入多个写入器,这些写入器将写入不同的对象。

希望这有帮助。

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

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

  • 我有几个不同的Spring批处理作业需要写入同一个平面文件。在平面文件中写入数据的顺序并不重要。这些批处理作业可能同时运行。 FlatFileItemWriter是否合适?我担心的是,如果多个作业同时尝试写入平面文件,数据可能会混合在一起。

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

  • 我目前正在编写一个Spring批处理,其中我正在读取一个数据块,并对其进行处理,然后我希望将此数据传递给两个Writer。一个writer将简单地更新数据库,而第二个writer将写入csv文件。 我计划编写自己的自定义编写器,并在customItemWriter中注入这两个ItemWriter,并在customItemWriter的write方法中调用这两个ItemWrite的write方法。这

  • 在spring batch中,我有一个需求,其中我有来自数据库的客户对象列表,我需要从这个列表中创建多个文本文件。 我希望将每个客户的数据写入不同的文本文件,如 提前谢了。