我正在使用Spring Batch的 JdbcPagingItemReader 来处理我的数据库中的条目。我正在查询的表中有一个时间戳列,我希望下次运行中的JdbcPagingItemReader只处理项目其中timestamp> “上次成功执行工作”
我认为这应该是一个相当常见的用例,但不知怎的,我无法弄清楚如何配置它。谢谢你的帮助!
答案 0 :(得分:1)
JdbcPagingItemReader
拥有自己的自定义重启逻辑。它搜索最后检索到的值,该值映射到唯一索引字段并从那里重新启动作业。
来自JavaDocs:
重新启动时,它使用最后一个排序键 找到要读取的第一页的值 (所以无论如何 已经成功处理了itmes 删除或修改)。
如您所见,您的时间戳字段不会产生任何显着差异。
阅读评论后更新:
好的,那么如何为PagingQueryProvider
动态创建where子句?
<bean id="itemReader" class="org.spr...JdbcPagingItemReader">
<property name="dataSource" ref="dataSource"/>
<property name="queryProvider">
<bean class="org.spr...SqlPagingQueryProviderFactoryBean">
<property name="selectClause" value="select id, name, credit"/>
<property name="fromClause" value="from customer"/>
<property name="whereClause">
<bean class="your.company.WhereClauseFactorybean" />
<property />
<property name="sortKey" value="id"/>
</bean>
</property>
<property name="parameterValues">
<map>
<entry key="status" value="NEW"/>
</map>
</property>
<property name="pageSize" value="1000"/>
<property name="rowMapper" ref="customerMapper"/>
</bean>
现在将WhereClauseFactorybean
实现为FactoryBean
,使用JdbcTemplate
查找上一个时间戳,如果找不到时间戳,则返回where timestamp > <your time stamp>
或null
之类的内容。
<强>参考:强>
阅读更多评论后更新:
然后我猜您必须implement a custom StepExecutionListener
,将AbstractSqlPagingQueryProvider
注入其中,并set the where clause方法注入beforeStep(StepExecution)
。