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

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

易雅畅
2023-03-14

我目前正在编写spring batch,在这里我读取一个XML数据,对其进行处理,然后将处理结果作为< code>map传递

 <Company att1="value">
      <employees>
        <employee></employee>
         <employee></employee>
         <employee></employee>
      <employees>
    </Company>

生成用于编组和解组的JAXB xjc类。JAXB生成的类如下所示。

@XmlRootElement(name="Company")
public class Company{
@XmlElements(name="employees" required="true")
}

JAXB员工类

@XmlRootElement(name="employees")
public class Employees
{
@XmlElement(name="Employee")
protected List<Employees> employee;
}

Spring XML配置文件

<batch:job id="reportJob">
<batch:step id="step1">
<batch:tasklet>
<batch:chunk reader="xmlItemReader" 
 writer="compositeItemWriter" processor="filterReportProcessor"
 commit-interval="2">
 </batch:chunk>
 </batch:tasklet>
</batch:step>
</batch:job>



<!-- Filtering process -->
<bean id="filterReportProcessor" class="com.examples.FilterReportProcessor" />

<bean id="xmlItemReader" 
    class="org.springframework.batch.item.xml.StaxEventItemReader">
<property name="fragmentRootElementName" value="record" />
<property name="resource" value="classpath:xml/company.xml" />
<property name="unmarshaller" ref="reportUnmarshaller" />
</bean>

<!-- Read and map values to object, via jaxb2 -->
<bean id="reportUnmarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
    <value>com.examples.Company</value>
    <value>com.examples.Employees</value>
    <value>com.examples.Employee</value>
</list>
</property>
</bean>

<bean id="compositeItemWriter" class="org.springframework.batch.item.support.CompositeItemWriter">
<property name="delegates"/>
    <list>
       <ref bean="testXMlWriter">
  </list>
</bean>
<bean id="testXMlWriter" class="com.test.example.TestXMLWriter">

处理器和写入器:

    public class FilterReportProcessor
    implement ItemProcessor<Employee,Map<String,Object>>{
    public Map<String,Object> process(Employee emplpyee) throws Exception{
    Map<String,Object> evnt = Mapper.crateMapping(emplpyee);
    return event; 
    }

    public class TestXMLWriter implemtes ItemWriter(Map<String,Object>){
    write(List <? extends Map<String, object>> lst){

    Employee e1 = new Employee();
    e1.setxxx(mapelementdata.item());

    Employees employs = new Employees();
    employs.add(e1);
    Comapany c1 = new Company();
    c1.add(employs);

   Marshaller m = context.createMarshaller();
   m.marshal(c1, resource.getFile());
  }

问题:

XML文件对于每个固定的提交间隔都是重写的,很明显,XML文件是在每个提交级别之后创建的。但我必须附加所有


共有1个答案

锺离正祥
2023-03-14

我认为您想要写入同一个文件,在这种情况下,我建议使用FlatFileItemWriter而不是您拥有的自定义编写器,并将属性appendAllowed设置为true,这将追加到文件(如果它已经存在)。将处理逻辑移至您的处理器,并使用lineAggregator将许多行批处理在一起进行写入。

如果您不想这样做,那么您必须求助于稍微复杂一点的编码,在WriterListener的beforeWrite方法中打开文件,读取内容,然后将其存储在上下文中,然后将其推送到Write方法。

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

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

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

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

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

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