2011-02-23 64 views
1

我正在使用SpringBatch的JdbcPagingItemReader用於處理我的數據庫中的條目。有一個在我查詢表中的時間戳列和我想要的JdbcPagingItemReader在未來的運行,只是處理在時間戳>「上次成功作業執行」使用上次成功的運行日期在下次運行查詢

我想這應該是一個相當普遍的使用情況下,項目但不知何故,我不知道如何配置它。謝謝你的幫助!

回答

1

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 clausebeforeStep(StepExecution)方法。

+0

好吧,我不想重新開始工作,我想在一小時後或第二天再次運行它 - 這是一個新的執行 – 2011-02-23 09:58:20

+0

@Thomas ok,加到我的答案 – 2011-02-23 10:16:20

+0

謝謝,我已經試過了在問這個問題之前,問題在於whereClause僅在啓動時生成一次,而不是每次執行作業時都會生成 – 2011-02-23 12:19:45