我正在使用Spring Batch 的JdbcPagingItemReader来处理我的数据库中的条目。我正在查询的表中有一个时间戳列,我希望下一次运行中的 JdbcPagingItemReader 只处理时间戳>“上次成功执行作业”的项目
我认为这应该是一个相当常见的用例,但不知何故我不知道如何配置它。谢谢你的帮助!
我正在使用Spring Batch 的JdbcPagingItemReader来处理我的数据库中的条目。我正在查询的表中有一个时间戳列,我希望下一次运行中的 JdbcPagingItemReader 只处理时间戳>“上次成功执行作业”的项目
我认为这应该是一个相当常见的用例,但不知何故我不知道如何配置它。谢谢你的帮助!
JdbcPagingItemReader
有它自己的自定义重启逻辑。它搜索映射到唯一索引字段的最后检索值并从那里重新启动作业。
从JavaDocs:
重新启动时,它使用最后一个排序键值来定位要读取的第一页(因此,成功处理的项目是否已被删除或修改并不重要)。
如您所见,您的时间戳字段不会产生任何显着差异。
阅读评论后更新:
好的,那么如何为您的 动态创建 where 子句PagingQueryProvider
?
<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
找到时间戳的内容。
参考:
阅读更多评论后更新:
然后我猜你将不得不实现一个 customStepExecutionListener
,将其AbstractSqlPagingQueryProvider
注入并在方法中设置 where 子句beforeStep(StepExecution)
。