【问题标题】:Spring Batch to Write file to multiple destinationsSpring Batch 将文件写入多个目的地
【发布时间】:2016-02-22 09:13:15
【问题描述】:

我目前正在编写 Spring Batch,我正在读取 XML 数据,对其进行处理,然后将处理器结果作为 map<string,object> 传递给 writer 并实现 CompositeItemWriter。以下是所需的输出 XML。

 <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 文件在每个提交级别之后创建。但我必须将所有 &lt;employee&gt; 对象附加到同一个 XML 文件中。如何实现此逻辑以在每个提交间隔后附加 &lt;employee&gt; 对象?

【问题讨论】:

  • 问题是什么?
  • 如何在同一批处理步骤执行中追加新的 xml 记录。
  • 修改问题并重新发布

标签: spring spring-batch


【解决方案1】:

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

如果您不想这样做,则必须使用更复杂的编码,即在 WriterListener 的 beforeWrite 方法中打开文件,读取内容,然后将其存储在上下文中,然后将其推送到写方法。

【讨论】:

  • 感谢您的回复。我必须生成 XML 输出而不是 CSV。我也从 Spring 中阅读了 StaxEventItemWriter 的概念,但是我在编写带有 Attributes 的 Root 标记元素时很复杂。请查看问题开头提到的 XML 输出。如果您有任何建议,请告诉我。
  • 你能添加你的输入xml的
  • 它看起来和我的输出 xml 一样,期望员工中的内容发生变化
  • Company 是根标签,具有属性 startdate、end date、id..Employees 和 Employee ..
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
相关资源
最近更新 更多