我正在使用SpringBatch的JdbcPagingItemReader用於處理我的數據庫中的條目。有一個在我查詢表中的時間戳列和我想要的JdbcPagingItemReader在未來的運行,只是處理在時間戳>「上次成功作業執行」使用上次成功的運行日期在下次運行查詢
我想這應該是一個相當普遍的使用情況下,項目但不知何故,我不知道如何配置它。謝謝你的幫助!
我正在使用SpringBatch的JdbcPagingItemReader用於處理我的數據庫中的條目。有一個在我查詢表中的時間戳列和我想要的JdbcPagingItemReader在未來的運行,只是處理在時間戳>「上次成功作業執行」使用上次成功的運行日期在下次運行查詢
我想這應該是一個相當普遍的使用情況下,項目但不知何故,我不知道如何配置它。謝謝你的幫助!
JdbcPagingItemReader
有它自己的自定義重啓邏輯。它搜索映射到唯一索引字段的最後一個檢索值,並從那裏重新開始作業。
從JavaDocs:
在重新啓動時,它使用最後一個排序關鍵字 價值定位的第一頁讀 (所以如果 成功處理itmes已經 刪除也無所謂或改性)。
正如您所看到的,您的時間戳字段不會產生任何顯着差異。閱讀評論後
更新:
OK,然後怎麼樣動態地爲您創造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
作爲使用JdbcTemplate
找到最後的時間戳,如果沒有時間戳發現返回類似where timestamp > <your time stamp>
或null
一個FactoryBean
。
參考:
閱讀更多評論後更新:
然後,我想你將不得不,注入AbstractSqlPagingQueryProvider
它和set the where clause在beforeStep(StepExecution)
方法。
好吧,我不想重新開始工作,我想在一小時後或第二天再次運行它 - 這是一個新的執行 – 2011-02-23 09:58:20
@Thomas ok,加到我的答案 – 2011-02-23 10:16:20
謝謝,我已經試過了在問這個問題之前,問題在於whereClause僅在啓動時生成一次,而不是每次執行作業時都會生成 – 2011-02-23 12:19:45