2009-11-28 73 views
0

我們的服務器Web應用程序將處理REST API請求所請求的作業。處理「死亡」Java作業的方法?

理想情況下,如果服務器在作業期間死亡(即:拔出插頭),則作業應該在啓動時恢復或重新啓動。

處理這些作業的一個非常方便的方法是在一個單獨的線程中使用Java 5中的某些併發實用程序類。唯一的問題是,如果出現故障,您需要寫下作業詳細信息並創建一個進程在啓動時讀取這些詳細信息並恢復作業。這看起來很痛苦。

的另一種方法是使用其中用戶發出請求的隊列,我們​​寫隊列,然後從隊列中讀取,並執行作業,並僅在作業完成時刪除該消息。這使得在啓動時輕鬆恢復作業,因爲服務器將在啓動時從隊列中讀取並恢復過程。

這種情況下是否有更好的方法?

回答

1

鑑於您指定了REST,您顯然有客戶提出請求並要求結果。爲什麼不把確定他們是否已經完成了客戶端本身的責任

例如客戶發出請求。如果得到的結果,一切都很好。但是,如果客戶端檢測到服務器已完成(通過HTTP連接上的提前斷開連接),則可以退出並稍後重試。如果你願意,你可以實現各種重試策略(例如,在不同的主機上重試,在'n'重試後放棄等等)。

通過這種方式,客戶維護他們需要什麼(因爲他們必須這樣做,無論如何,大概),你的服務器是無狀態的,這是一個更容易管理知識。

+0

同意這樣更容易管理。去試試這個.. – 2009-11-29 20:27:46

1

我想用Quartz(它具有故障轉移功能)來管理你的工作。

PS:我寧願是錯誤的,但看了你最後的問題,我有你正在構建的東西過於複雜或概念錯誤的感覺。有太多的建築氣味恕我直言。