2013-09-30 61 views
0

我有一個塊的處理步驟,其非transactionnal改變:SpringBatch,塊處理,並試圖恢復上一個塊回滾

  • 1)創建在數據庫
  • 2的用戶)打開上的一個帳戶遠程系統,通過HTTP調用

我們支付在遠程系統上的賬戶,並在批處理失敗,我們想避免創建永遠不會因爲用戶使用遠程帳戶在我們的數據庫已經rollbacked ...

如果我有一個大小爲100的塊,那麼如果在第2個項目的遠程調用期間發生異常,那麼我的業務邏輯可以捕獲該異常,嘗試關閉該特定項目的遠程帳戶,並且然後重新拋出異常以觸發塊回滾。

但是,對於之前處理的第49個項目,數據庫中的用戶將被回滾,但帳戶不會被關閉。

因此,50個用戶將在數據庫上回滾,但只有1個遠程帳戶將被關閉。

如何整理我的步驟可以關閉50個遠程帳號(如果本手冊回滾失敗,它不是一個一致性的問題:盡力而爲)

回答

0

什麼額外的步驟,關閉不需要的帳戶?每個打開的賬戶都被存儲在其自己的交易中的額外表格(OPENED_ACCOUNT)中,所以它不會通過彈簧批次回滾。
清潔步驟將一起存儲在OPENED_ACCOUNT的數據進行操作,你可以對錯誤重啓,管理自定義重試運行等

+0

對不起,我不知道該underderstand你的意思。我不明白當你在'OPENED_ACCOUNT'表中插入什麼東西時 –

+0

每次你創建一個有效的賬戶時,你都會把這些信息存儲在'OPENED_ACCOUNT'表中(使用單獨的事務)。當您保存塊時,您將在同一事務中刪除「OPENED_ACCOUNT」內容:如果塊提交失敗,您將在OPENED_ACCOUNT中刪除在清除步驟中刪除的帳戶 –

+0

但是,插入OPENED_ACCOUNT也可能失敗。順便說一下,在步驟ExecutionContext中存儲當前塊打開的賬戶是不是更容易? –