提交间隔=" 3"在写作时总是将数据替换3次

时间:2014-11-28 08:50:20

标签: spring-batch

我在示例代码上使用SpringBatch。

SpringBatch支持面向块的编程,所以我尝试使用commit-interval属性。

我的工作配置是这样的

<batch:job id="csv2xmlJob">
    <batch:step id="csv2xmlStep">
        <batch:tasklet>
            <batch:chunk reader="csvFileItemReader" processor="filterProcessor"
                writer="xmlFileItemWriter" commit-interval="5"></batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

<!-- csv file reader -->
<bean id="csvFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="file:report.csv"></property>
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <property name="lineTokenizer">
                <bean
                    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names" value="firstName, lastName"></property>
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean
                    class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                    <property name="prototypeBeanName" value="person"></property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

<!-- xml file writer -->
<bean id="xmlFileItemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="resource" value="classpath:person.xml"></property>
    <property name="marshaller" ref="personUnmarshaller2"></property>
    <property name="rootTagName" value="info3"></property>
</bean>

<bean id="personUnmarshaller2" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.mycode.batch.Person</value>
        </list>
    </property>
</bean>

这里是csv格式

CUBA,DOE
JACKSON,DOE
JILL,DOE
JOHN,DOE
BOO,DOE

在上面的代码中,我为commit-interval设置了5然后 每次运行此代码时,最后一项都会被写入xml文件5次。

输出xml文件

<?xml version="1.0" encoding="UTF-8"?>
<info3>
    <person>
        <firstname>BOO</firstname>
        <lastname>DOE</lastname>
    </person>
    <person>
        <firstname>BOO</firstname>
        <lastname>DOE</lastname>
    </person>
    <person>
        <firstname>BOO</firstname>
        <lastname>DOE</lastname>
    </person>
    <person>
        <firstname>BOO</firstname>
        <lastname>DOE</lastname>
    </person>
    <person>
        <firstname>BOO</firstname>
        <lastname>DOE</lastname>
    </person>
</info3>

我真的不知道为什么作家会重复项目。

[增订] 当我将commit-interval设置为1时,它可以正常工作。 这是我的处理器代码。它只是简单地将字符串替换为大写。

public class FilterProcessor implements ItemProcessor<Person, Person> {

    @Override
    public Person process(Person person) throws Exception {
        String firstName = person.getFirstName().toUpperCase();
        String lastName = person.getLastName().toUpperCase();

        Person processedPerson = new Person(firstName, lastName);

        System.out.println(processedPerson.toString());

        return processedPerson;
    }

}

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并且可以通过更改BeanWrapperFieldSetMapper来解决自定义fieldSetMapper,这样就不需要将commit-interval设置为1