2016-02-22 38 views
0

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

<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 Employee类

@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文件中的每个提交级后,会创建。但我必须将所有<employee>对象附加到同一个XML文件。如何实现这个逻辑在每个提交时间间隔后追加<employee>对象?

+0

是什么问题? – Pooya

+0

如何在同一批处理步骤中添加新的xml记录。 – vanreddy

+0

修改问题并转贴 – vanreddy

回答

0

我想你想写入相同的文件,在这种情况下,我会建议使用FlatFileItemWriter而不是自定义写入器,并将属性appendAllowed设置为true,如果该文件已存在,则会附加到该文件。处理逻辑到您的处理器并使用lineAggregator将多个行批量写入。

如果你不想这样做,那么你不得不求助于一个更复杂的编码,在WriterListener的beforeWrite方法中打开文件,读取内容,然后将其存储在上下文中,然后推送它写入方法。

+0

感谢您的回复。我必须生成XML输出而不是CSV。此外,我已经从Spring读了StaxEventItemWriter的概念,但是由于我使用Attributes编写Root标记元素的复杂性。请查看问题开始时提到的XML输出。如果您有任何建议,请告诉我。 – vanreddy

+0

您可以添加您的输入xml – Sundar

+0

它看起来与我的输出xml相同,期望员工中的内容得到更改 – vanreddy

相关问题