2

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

我认为这应该是一个相当常见的用例,但不知何故我不知道如何配置它。谢谢你的帮助!

4

1 回答 1

1

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>

现在实现WhereClauseFactorybeanFactoryBean用于JdbcTemplate查找最后一个时间戳并返回类似where timestamp > <your time stamp>或未null找到时间戳的内容。

参考:


阅读更多评论后更新:

然后我猜你将不得不实现一个 customStepExecutionListener,将其AbstractSqlPagingQueryProvider注入并在方法中设置 where 子句beforeStep(StepExecution)

于 2011-02-23T09:43:58.733 回答