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部分。
感谢您的阅读!
可惜塔t'FlatFileItemWriter#state'和'FlatFileItemWriter#resource'都是私有的(我会投票保护或提供公共getter)。否则,可以在'FlatFileItemWriter#close()'中实现“if.state.getPosition()== 0”,然后执行'resource.getFile()。delete();'“。 –