数据库到文件程序查询

时间:2011-12-05 11:54:24

标签: spring-batch

我有一个弹簧批处理程序,它从数据库读取并写入文件。

工作是:

<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>

项目阅读器是:

<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 个答案:

答案 0 :(得分:1)

步骤开始时文件将被打开,你可以

  • 创建一个以懒惰方式使用该文件的自定义FlatFileItemWriter
  • 如果没有书写行,创建一个删除文件的后续步骤,如果您使用flow
  • ,这可能是更通用的解决方案
  • 使用一个简单的shell脚本来检查作业后的文件,如果它是空的则删除它