Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring batch 数据库到文件程序查询_Spring Batch - Fatal编程技术网

Spring batch 数据库到文件程序查询

Spring batch 数据库到文件程序查询,spring-batch,Spring Batch,我有一个spring批处理程序,它从数据库读取数据并写入文件 工作是: <job id="MyTransactionJob" job-repository="jobRepository" incrementer="dynamicJobParameters"> <step id="TransactionfileGenerator"> <tasklet transaction-manager="jobRepository-transactionManag

我有一个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>

项目阅读器为:

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


谢谢你的阅读

该文件将在步骤开始时打开,您可以

  • 创建以惰性方式使用文件的自定义FlatFileItemWriter
  • 创建一个后步骤,如果没有写入行,则删除该文件。如果使用
  • 使用一个简单的shell脚本,在作业之后检查文件,如果文件为空,则将其删除

遗憾的是
FlatFileItemWriter#state
FlatFileItemWriter#resource
都是私有的(我会投票选择受保护的或提供公共getter)。否则可以在
FlatFileItemWriter\close()中实现“if
state.getPosition()==0
然后
resource.getFile().delete();
”。