Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在下一次运行中使用查询的上次成功运行日期_Java_Spring_Spring Batch - Fatal编程技术网

Java 在下一次运行中使用查询的上次成功运行日期

Java 在下一次运行中使用查询的上次成功运行日期,java,spring,spring-batch,Java,Spring,Spring Batch,我正在使用SpringBatch的JdbcPagingItemReader处理数据库中的条目。我正在查询的表中有一个timestamp列,我希望JdbcPagingItemReader在下一次运行时只处理项目,其中timestamp>“上次成功执行作业” 我认为这应该是一个相当常见的用例,但不知何故,我不知道如何配置它。谢谢你的帮助 JdbcPagingItemReader有自己的自定义重启逻辑。它搜索映射到唯一索引字段的最后检索到的值,并从该字段重新启动作业 从: 重新启动时,它使用最后一个排

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


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

JdbcPagingItemReader有自己的自定义重启逻辑。它搜索映射到唯一索引字段的最后检索到的值,并从该字段重新启动作业

从:

重新启动时,它使用最后一个排序键 值来定位要读取的第一页 (因此,如果 已成功处理ITME 删除或修改)

正如您所看到的,时间戳字段不会产生任何显著差异


阅读评论后更新:

好的,那么动态地为您的
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
查找最后一个时间戳,并返回类似
wheretimestamp>
null
的内容(如果未找到时间戳)

参考资料:


阅读更多评论后更新:


然后,我想您必须将注入到它和方法中。

好吧,我不想重新启动作业,我想在一小时后或第二天再次运行它-这是一个新的任务execution@Thomas好的,补充我的回答谢谢,在问问题之前我已经试过了,问题是where子句只在启动时生成一次,而不是每次作业启动时生成executed@Thomas杜比斯特·内哈特·努斯:-)我已经在我的回答中添加了更多的内容,非常感谢你迄今为止的帮助。。。我想我们快到了;-)我遇到的最后一个问题是JdbcPagingItemReader在其afterPropertiesSet方法中只调用generateFirstPageQuery一次,因此在此之后对where子句的任何更改都不会产生任何影响