我在示例代码上使用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;
}
}
答案 0 :(得分:0)
我遇到了同样的问题并且可以通过更改BeanWrapperFieldSetMapper来解决自定义fieldSetMapper,这样就不需要将commit-interval设置为1