2011-12-05 81 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();'「。 –