在下次运行中使用上次成功运行日期进行查询

时间:2011-02-23 09:16:59

标签: java spring spring-batch

我正在使用Spring Batch的 JdbcPagingItemReader 来处理我的数据库中的条目。我正在查询的表中有一个时间戳列,我希望下次运行中的JdbcPagingItemReader只处理项目其中timestamp> “上次成功执行工作”

我认为这应该是一个相当常见的用例,但不知怎的,我无法弄清楚如何配置它。谢谢你的帮助!

1 个答案:

答案 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)