春季批处理-将多个文件写入多个目标位置

时间:2018-10-11 04:32:02

标签: java spring spring-batch

我是Spring批处理的新手,目前正在从事新的批处理工作。我的批处理作业:

  1. 阅读器:从数据库(即5家公司的员工)中读取记录
  2. 处理器:处理记录
  3. 5个编写器:过滤记录并将其写入每个文件(例如,公司A的雇员将在路径A写入公司A文件,公司B的雇员将在路径B写入公司B文件),最后一个作者会将所有辞职的员工从公司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>

但是,我意识到,如果读取器从数据库中检索到5万条记录,则每个写入器将循环所有记录,搜索其各自的公司员工并写入文件,这总共是5 x 5万次,并且是多余的。因此,我担心性能。

我能想到的一些解决方案:

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

请告诉我如何实现上述方法或如何实现批处理作业目标。

1 个答案:

答案 0 :(得分:0)

ClassifierCompositeItemWriter是必经之路。 Classifier将对项目进行分类并将其传递给指定的作者。这样,每个编写器将只接收分配给该类的类的项目,而不会遍历该块中的所有项目。

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

有一个与此类似的问题,我在这里添加以供参考:Read flat file and write to multiple writers which will write different objects

希望这会有所帮助。