问题描述
我有一个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完成工作之前先运行。
我认为这是Spring Writer延迟来写入文件,而我的tasklet
首先运行。 Spring批处理中的步骤是否不同步?无论编写者是否完成,tasklet
都会运行?
如果是,该如何预防?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)