Spring FlatFileItemWriter会延迟写入文件吗?

问题描述

我有一个Spring批处理,它将数据写入文本文件,在写入文本文件后,该批处理还有另一个步骤来重命名文件并进行备份。以下是我的批处理xml中的代码的一部分:

    <job id="sprFileGenerationJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="FileGeneration_step1" next="backupFileGenerationStep">
        <tasklet>
            <chunk reader="fileGenerationTableReader" writer="fileGenerationFileWriter" chunk-completion-policy="fileGenerationCompletionPolicy"  />
            <transaction-attributes isolation="DEFAULT" propagation="REQUIRES_NEW" />
        </tasklet>
    </step> 
    <step id="backupFileGenerationStep">
        <tasklet ref="fileGenerationBackupFiletasklet"/>
    </step>
</job>

这是fileGenerationFileWriter bean:

<bean id="fileGenerationFileWriter" class="com.job.writer.FileGenerationFileWriter" scope="step">
        <property name="delegate">
            <bean  class="org.springframework.batch.item.file.FlatFileItemWriter">                  
                <property name="resource" value="file:#{jobParameters['output.dir']}" />        
                <property name="lineAggregator">
                    <!-- Our Mapper for file writer -->
                    <bean class="org.springframework.batch.item.file.transform.PassthroughLineAggregator" />
                </property>
                <!-- Header call back,add in when necessary -->
                <property name="headerCallback" ref="bulkPaymentFileGenerationFileWriter" />
                <!-- Footer call back,add in when necessary -->
                <property name="footerCallback" ref="bulkPaymentFileGenerationFileWriter" />
                <property name="appendAllowed" value="false" /> 
            </bean>
        </property>
        <property name="companyId" value="#{jobParameters['companyId']}" />
        <property name="dataSource" ref="dataSource" />
    </bean>

这是fileGenerationCompletionPolicy bean:

<bean id="fileGenerationCompletionPolicy" class="org.springframework.batch.repeat.policy.DefaultResultCompletionPolicy"/>

这是fileGenerationBackupFiletasklet bean:

<bean id="bulkpaymentFileGenerationBackupFiletasklet" class="com.job.tasklet.BulkPaymentFileGenerationBackUpFiletasklet" />

该类没有什么特别的,它仅实现Spring tasklet,并执行execute():

localFile = resource.getFile();
log.info("localFile.length() : " + localFile.length());

if (localFile.length() > 0) {
// do file rename
}

但是,在此类中,日志显示文件长度为0,表示文件为空。但是实际上,我去检查文件文件中写入了正确的数据。表示tasklet步骤在Writer完成工作之前先运行。

由于if检查发现文件长度为0,因此重命名过程没有运行。

我认为这是Spring Writer延迟来写入文件,而我的tasklet首先运行。 Spring批处理中的步骤是否不同步?无论编写者是否完成,tasklet都会运行?

如果是,该如何预防?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...