0

我有一个 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 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 id="fileGenerationCompletionPolicy" class="org.springframework.batch.repeat.policy.DefaultResultCompletionPolicy"/>

这是fileGenerationBackupFileTasklet豆子:

<bean id="bulkpaymentFileGenerationBackupFileTasklet" class="com.job.tasklet.BulkPaymentFileGenerationBackUpFileTasklet" />

这个类没有什么特别的,它只是实现了 SpringTasklet并执行了 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是否完整,意志都会运行?

如果是,如何防止这种情况?

4

0 回答 0