2014-02-21 120 views
0

我正在建立一個系統,它有一個基本的產品消費者的範例味道,但生產者部分需要在交易模式。 這是我確切的情況:BlockingQueue內部交易java

Poller Thread - 
[Transaction START] 
    Polls the DB for say 10 records 
    * Sets the status in DB for those records as IN-Progress 
    * Puts the above 10 records in a LinkedBlockingQueue - workqueue 
[Transaction END] 

Worker Thread Pool of 5 
    * Polls the workqueue for the tasks, do some lookups and update the same records in DB with some looked up values. 

現在我的問題是1的過程的一部分,因爲如果讓說,一些原因,我的提取和更新由DB是成功的,但在隊列中插入的過程,一個失敗記錄,我可以回滾整個事務,並且我的數據庫中的所有記錄都將處於NOT Processed狀態,但可以在此工作隊列中插入一些元素,並且我的工作線程池可以拾取它們並開始處理,而不應該發生。

試圖找到是否有辦法以跨國的方式寫入到blockingqueue。

考慮添加一些writelock()readlock()機制,如果我可以阻止工作線程讀取隊列中正在寫入的內容。

任何想法爲更好的方法。

感謝,

回答

0

考慮最壞的情況:拔下的情況下(數據庫連接丟失)和碰撞的情況下(程序內存不足)。你將如何從那裏恢復?

一些提示:

  • 如果你能想到的一個原因,在隊列中插入會失敗(隊列已滿),不要啓動事務。只需跳過一次投票。
  • 首先提交正在進行的事務,然後將所有記錄添加到工作隊列中。或者對每個記錄使用一個事務,以便您可以逐個將記錄添加到工作隊列中。
  • 維護正在處理的所有記錄的ID的內存HashSet。如果該ID在該組中,但該記錄未處於進行中,反之亦然,則某些內容非常錯誤(例如記錄任務未完成/墜毀)。
  • 設置進行中設置的時間戳。讓另一個後臺進程檢查正在進行太久的記錄。如果ID不在進行中的HashSet中,則重置正在進行的狀態,並且正常進程將重試操作。
  • 使你的任務冪等:看看你是否能找到一種方式,任務可以識別已經完成的記錄工作。這可能是一個相對昂貴的操作,但它可以保證只有在重試的情況下才能完成工作。