簡體   English   中英

在tomcat中正常關閉春季批處理作業

[英]Shutting down spring batch jobs gracefully in tomcat

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

我在這里已經讀到,JobScope和StepScope作業在關閉時效果不佳。

該文章建議不要使用JobScope或StepScope,但我不禁要認為這是一個已解決的問題,在該問題中,人們必須在應用程序退出時采取某些措施以防止出現此問題。

是否有一些最佳實踐來處理這種情況? 您在應用程序中做什么?

我們正在使用3.0.3版本的spring-batch。

我將為您提供有關如何解決這種情況的想法 不一定是批量解決方案。

每當我需要在應用程序中添加作業時,我都會這樣做:

  1. 創建一個表來控制作業(隊列,優先級,狀態等)
  2. 創建一個JobController類來管理所有作業
  3. 所有作業均由狀態R運行, FQ隊列定義(您可以根據需要添加更多內容,如中止,取消等)(這些作業控制這些狀態)
  4. jobController只能加載一次,您可以為此定義它作為一個Spring bean。
  5. JobController添加一個布爾屬性,以在實例化時通知您是否已經檢查了作業。 將其設置為false
  6. 檢查是否存在具有R狀態的作業,這意味着它們在服務器的最后一站正在運行,因此您將具有R狀態的每個作業更新為Q並增加其優先級,以便在重新啟動服務器后首先執行該作業。 將該檢查設置為true后,該檢查位於該布爾屬性的if中。

這樣,每次您第一次調用JobController時,由於服務器崩潰而有未完成的作業,您便可以將所有參數設置為可以再次執行的狀態。 由於您將檢查該boolean屬性,因此該檢查僅會發生一次。

您應該注意的一件事是謹慎處理工作優先級,如果處理不當,可能會遇到飢餓問題。

您可以輕松地將此解決方案改編為春季批處理。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM