2015-11-19 21 views
2

我們在提供我們的UI的相同Web應用程序中在tomcat中運行多個spring批處理作業。最近我們增加了更多的工作,並且我們注意到,當我們修補我們的應用程序時,一些工作可能會陷入「開始」或「開始」狀態。其中許多作業確保另一項作業在啓動之前未運行,因此這意味着在我們修補服務器之後,我們的某些作業會被破壞,直到我們手動運行SQL將作業的狀態更新爲ABANDONED或STOPPED。在tomcat中關閉spring批處理作業

我已閱讀here JobScope和StepScope作業在關閉時播放效果不佳。

該文章建議不要使用JobScope或StepScope,但我不禁想到這是一個解決的問題,人們必須在應用程序退出時執行某些操作來防止此問題。

有沒有處理這種情況的一些最佳做法?你在你的應用程序中做什麼?

我們正在使用彈簧批處理版本3.0.3.RELEASE

+0

範圍在引用的文章中的問題不負責停止不起作用,那裏的作業配置只是明顯錯誤(範圍不使用,並在提供的示例中沒有用) –

回答

3

我將爲您提供關於如何解決此方案的想法。不一定是一個彈簧批量解決方案。

每次我需要在一個應用程序中添加的工作我這樣做,因爲這:

  1. 創建一個表來控制作業(隊列,優先級,狀態等)
  2. 創建JobController類來管理所有作業
  3. 所有作業進行狀態R - 運行定義,F - 成品,Q -Queue(你可以添加更多您需要像中止,取消等)(作業控制這些狀態)
  4. 第j obController只能加載一次,您可以將其定義爲彈簧bean
  5. 將布爾屬性添加到JobController以通知您是否在實例化時檢查了作業。將其設置爲false
  6. 檢查是否存在具有R狀態的作業,這意味着在他們正在運行的服務器的最後一站中,因此您將此R狀態的每個作業更新爲Q並提高它們的優先級,以便首先執行它重新啓動服務器後。該檢查位於該布爾屬性的if之內,並將檢查設置爲true。

這樣,每當您第一次調用JobController並且存在服務器崩潰時未完成的作業,您都可以將其設置爲可以再次執行的狀態。而且這個檢查只會發生一次,因爲您將檢查該布爾屬性。

你應該知道的一件事是謹慎對待你的工作優先級,如果你管理錯誤,你可能會遇到飢餓問題。

您可以輕鬆地將此解決方案適應於彈簧式批處理。

希望它有幫助。

+0

我感謝您花時間給我一個深思熟慮的答案。我可以通過將所有狀態設置爲ABORTED來實現我自己的解決方案,如果它們在應用程序啓動時設置爲STARTING或STARTED,可能在Spring中使用ServletContextListener或某種啓動監聽器。我希望有一個更優雅的解決方案。再次感謝評論。 –

相關問題