2013-03-01 35 views
1

我們正在開發基於Hibernate的Spring應用程序,它將負責發送1000封電子郵件。Spring批處理和休眠 - 羣發電子郵件應用程序

簡而言之,目前只有一個作業定義了一個步驟。

<job id="emailJob" xmlns="http://www.springframework.org/schema/batch" restartable="true" 
    job-repository="jobRepository"> 
    <step id="emailJobFetchUsers"> 
     <tasklet> 
      <chunk reader="emailItemReader" processor="emailItemProcessor" writer="emailItemWriter" commit-interval="1"/> 
     </tasklet> 
     <end on="COMPLETED"/> 
     <fail on="FAILED"/> 
    </step> 
    <listeners> 
     <listener ref="loggingListener"/> 
    </listeners> 
</job> 
  • emailItemReader延伸HibernateCursorItemReader並返回該行的實體(在這種情況下,它代表了客戶的選擇電子郵件的記錄)
  • emailItemProcessor生成和向客戶發送特定電子郵件
  • emailItemWriter僅更新了實體的一些信息,比如最後的發送日期

雖然這工作的,我不知道這是否都應該一步到位,或者每一個行動都應該有一個步驟負責。我主要關心的是可重啓性和恢復。也就是說,對於一個用戶(可能是由於無效的電子郵件地址或生成電子郵件的問題)發生了這種異常,或者如果應用程序服務器出現故障並重新啓動,我希望它能夠從它離開的位置接收發送的電子郵件關閉。

任何人都可以在上面提出建議嗎?

謝謝,

回答

0

是的,它應該是可重新啓動的。檢查讀者超類的javadoc。你必須要小心以下,但:

  • 你需要在你的查詢維持秩序 - 讀者將剛剛從失敗的項目入手,讓每個查詢的執行必須以相同的順序返回項目
  • 如果itemWriter中的實體修改會影響查詢結果,那麼可能會非常棘手 - eq如果通過最後發送日期過濾器,那麼它會不會達到預期效果

更重要的是,我相信,如果發生以下情況:

  1. 作業執行失敗
  2. 一個新客戶插入在DB \
  3. 工作重新啓動

然後將查詢結果可能比在第一也是不同的(失敗)執行。如果您的應用可能會出現這種情況,那麼我建議添加一些條件以防止它發生 - 比如在查詢中添加支票以跳過在第一個工作執行時間後註冊的客戶。

相關問題