Spring Batch-根据条件写入两个不同的文件

时间:2019-01-08 07:52:29

标签: spring-batch

我想将数据写入两个不同的文件。如果我的条件为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>

2 个答案:

答案 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) {

 }  

 }