Spring Batch Framework编写器仍在处理甚至读者遇到的Nullpointerexception

时间:2015-11-06 06:00:03

标签: spring-batch

我的批处理作业阅读器返回Nullpointerexception,但文件仍然生成。为什么会这样?我认为当读者和处理器完成这个过程时,作者才会被调用?

<bean id="myWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" >
    <property name="resource"
        value="file:D:\out\file.txt" />
    <property name="lineAggregator">
        <bean
            class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" />
    </property>
    <property name="footerCallback" ref="myCustomWriter" />
<!--    <property name="headerCallback" ref="myCustomWriter" /> --> 
</bean>
<bean id="myCustomWriter" class="com.spring.batch.MyWriter"
    scope="step">
    <property name="delegate" ref="myWriter" />
    <property name="stepContext" value="#{stepExecution.stepName}" />
</bean>

2 个答案:

答案 0 :(得分:3)

你的意思是什么?它是空的,还是包含数据?

在执行某个步骤之前,spring-batch框架为读者和作者调用ItemStream接口的open()方法(前提是你有Readers和Writers实现ItemStream)。

查看FlatFileItemWriter实现。您会看到它实现了ItemStream,因此具有open()方法的实现。

更详细地查看代码,您会看到open()调用doOpen(),它调用HeaderCallback(如果已定义)。因此,在调用writer-method或Reader的reader-method之前,会生成文件并写入标题。

我建议你在开放的Reader and Writer方法中放置一个断点,并在spring-batch框架的代码中稍微调试一下。它将使您更好地了解“引擎盖下”的情况。

这可能超出了您的初始问题的范围,但如果您想深入研究一步中的“交易处理”,TobiasFlöhre有三篇优秀的博客文章涵盖了这一主题:

答案 1 :(得分:0)

步骤的提交间隔控制何时调用writer。它的工作方式是

  1. 调用读者来批量阅读N个项目(实际上是如何实现的,概念上它应该读取一个项目,然后处理一个项目)
    1. 逐个处理N个项目
    2. 在提交计数时,一次写下所有N个项目。
  2. 在[{3}}

    章节的文档中对此进行了详细说明
    • 在编写器初始化期间,文件首次写入之前的某个时间也将调用页眉回调,页脚回调