我想将数据写入两个不同的文件。如果我的条件为true,则写入x文件,否则写入y文件。
当前,我有一个平面文件项目写入器,可将所有数据写入一个文件。我想指定两个不同的文件,并且根据条件数据应转到垂直文件。
<beans:bean id="itemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<beans:property name="resource">
<beans:bean class="org.springframework.core.io.FileSystemResource" scope="step">
<beans:constructor-arg value="${process.output.dir}/${output.file.name}_#{jobParameters['run.id']}.${output.file.extension}" type="java.lang.String" />
</beans:bean>
</beans:property>
<beans:property name="lineAggregator">
<beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
<beans:property name="delimiter" value="|" />
<beans:property name="fieldExtractor">
<beans:bean class="com.abc.common.batch.item.file.transform.FormattingFieldExtractorDecorator">
<beans:property name="fieldExtractor">
<beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor" >
<beans:property name="names" value="${output.field.names}" />
</beans:bean>
</beans:property>
<beans:property name="defaultDateFormat" value="yyyyMMdd" />
<beans:property name="defaultDecimalFormat" value="############0.00" />
</beans:bean>
</beans:property>
</beans:bean>
</beans:property>
<beans:property name="headerCallback">
<beans:bean class="com.abc.common.batch.item.file.HeaderWriter">
<beans:constructor-arg value="${output.column.names}" />
</beans:bean>
</beans:property>
<beans:property name="footerCallback">
<beans:bean class="com.abc.footer.ItemCountFooterCallback" >
<beans:constructor-arg name="count" ref="itemCount" />
</beans:bean>
</beans:property>
</beans:bean>
答案 0 :(得分:1)
ClassifierCompositeItemWriter是必经之路。它使用Classifier
对项目进行分类(在这里您将实现条件),并使用多个项目编写器(每个人将编写一个特定的项目“类”)。
您可以找到示例here。
希望这会有所帮助。
答案 1 :(得分:0)
您绝对可以执行此操作,可以实现自定义项目编写器,然后根据您的条件可以完成写入不同文件的任务。
但是在这种情况下-文件的条件和处理可能会影响应用程序的性能,因此您需要谨慎实施
这里我只是为您提供布局,您可以在文件中编写写入的实现,首先编写自定义项目写入器-
https://www.programcreek.com/java-api-examples/index.php?api=org.springframework.batch.item.ItemWriter
然后实现自定义itemWriterListener-在其中使用beforeWrite方法,您可以设置其他资源
public class WriteListener implements ItemWriteListener{
@Autowire
ItemWrite writer;
public void beforeWrite(List items) {
condition 1 (){
writer.setResource(1)
}
condition 2 (){
writer.setResource(2)
}
}
public void onWriteError(Exception exception, List items) {
System.out.println("Error occurred when writing items!");
}
public void afterWrite(List items) {
}
}