2011-12-05 43 views
0

我有一个从数据库中读取并写入文件的spring批处理程序。数据库到文件程序查询

工作是:

<job id="MyTransactionJob" job-repository="jobRepository" incrementer="dynamicJobParameters"> 
<step id="TransactionfileGenerator"> 
     <tasklet transaction-manager="jobRepository-transactionManager"> 
      <chunk reader="MyItemReader" writer="MyItemWriter" commit-interval="1000" skip-policy="skipPolicy"/> 
     </tasklet> 
     <listeners> 
      <listener ref="MySkipListener"/> 
    </listeners> 
    </step> 
</job> 

产品Reader是:

<beans:bean id="MyItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
    <beans:property name="dataSource" ref="jobRepository-dataSource" /> 
    <beans:property name="sql" value="${dbTofileDataReadSQL}"/> 
    <beans:property name="rowMapper"> 
     <beans:bean class="com.mypackage.MyRowMapper" /> 
    </beans:property> 
</beans:bean> 

dbTofileDataReadSQL是基于一些条件的一个简单选择SQL。所以如果条件不满足,将返回0行。

项作家是:

<beans:bean id="MyItemWriter" class="com.mypackage.MyDbToFileItemWriter"> 
    <beans:property name="delegate"> 
     <beans:bean class="org.springframework.batch.item.file.FlatFileItemWriter"> 
      <beans:property name="resource" value="file:c:\output.dat" /> 
      <beans:property name="shouldDeleteIfExists" value="true"/> 
      <beans:property name="lineAggregator"> 
       <beans:bean class="org.springframework.batch.item.file.transform.PassThroughLineAggregator" /> 
      </beans:property> 
     </beans:bean> 
    </beans:property> 
</beans:bean> 

问题是,即使返回的行数为0的空文件将创建为作家将始终运行。

是否可以放入一个条件,以便当且仅当至少有一行要写入时才创建该文件。否则完全跳过ItemWriter部分。

感谢您的阅读!

回答

1

当步启动时,您可以

  • 创建一个使用文件中的一个懒惰的方式
  • 创建其删除该文件的AfterStep的自定义FlatFileItemWriter如果没有书面线的文件将被打开,这可能是一个更通用的解决方案,如果你使用了flow
  • 使用一个简单的shell脚本,在作业完成后检查文件并删除它,如果它是空的
+0

可惜塔t'FlatFileItemWriter#state'和'FlatFileItemWriter#resource'都是私有的(我会投票保护或提供公共getter)。否则,可以在'FlatFileItemWriter#close()'中实现“if.state.getPosition()== 0”,然后执行'resource.getFile()。delete();'“。 –