我有一个 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
是否完整,意志都会运行?
如果是,如何防止这种情况?