簡體   English   中英

Grails Quartz2作業隨機停止

[英]Grails Quartz2 job stops randomly

我遇到一種情況,我的Grails應用程序中的一項作業會在沒有任何明確原因的情況下停止運行。 沒有拋出異常。 我們正在使用Grails 2.2.3和Quartz2插件。 有趣的是,所有其他作業仍在繼續運行; 只有一項特定的工作一次又一次地凍結。 該工作會調用第三方REST API調用,有時會給出非常延遲的響應,並且在少數情況下也完全沒有響應。 所有作業都是並發= false 有人可以指出我正確的方向嗎? 自從我努力解決此問題以來已經過去了兩天。 我嘗試過的幾件事:

  1. 更改/簡化了作業處理任務的實施。 該作業仍進行REST API調用。 有時響應時間非常長(最多20分鍾),並且在少數情況下我們會遇到ConnectionTimeOut異常。
  2. 啟用石英測井。 作業凍結,日志記錄不提供任何錯誤消息。
  3. 安裝了Grails石英顯示器插件。 我們使其內聯,並對其進行了調整以使其與Quartz2插件一起運行。 它只顯示通常的石英/列表。

尚未能夠解決該問題,並且現在耗盡了所有想法。 是否有人遇到過這種情況並有一些技巧要分享。 謝謝。

注意:現在,我們已刪除了對第三方REST API的調用,該調用花費了很長時間才能查看作業是否可以長時間正常運行。 我猜服務器有時會終止耗時太長或定期超時的進程。

我們已經能夠解決這個難題。 問題在於,對第三方服務器之一的API調用在長達40至50分鍾的時間內未獲得響應,此后服務器將超時並關閉連接。 我們在作業的每次運行中都使用了多線程,由於某些“笨拙”的實現,它沒有給我們帶來真正的“ 並發=假 ”行為。 因此,在某種程度上,我們與該第三方服務器有成千上萬的開放式連接,而對於大多數請求根本沒有響應(在40-50分鍾之內)。 這只是我們的猜測,一段時間后,該特定作業/計划程序將凍結。

我們能夠找到該問題的兩種解決方案:

  1. 利用我們的傳出API請求實現更短的連接超時和讀取超時。 在此處 閱讀 連接超時閱讀超時之間的區別。 這是我們編寫的代碼:

    URL url =新URL(urlString)
    HttpURLConnection httpURLConnection =(HttpURLConnection)url.openConnection()httpURLConnection.setConnectTimeout(5 * 1000 * 60)
    httpURLConnection.setReadTimeout(8 * 1000 * 60)

  2. 我們能夠成功測試的第二個解決方案是通過從Linux crontab實用程序調用應用程序的action / url來進行API調用。 我們要做的是在我們的應用程序中點擊一個特定的URL,這反過來又使第三方調用了API,因此,從某種意義上說,我們從應用程序中刪除了整個石英調度程序/插件的依賴關系,即我們不在此使用石英調度程序案件。 這種方法的唯一缺點是,我們從應用程序代碼庫之外觸發了REST API調用。 因此,如果我們將應用程序的WAR部署到另一台計算機上,則我們也必須配置Linux crontab。

我們最終實現了第一個解決方案(連接/讀取超時解決方案),因為它將解決方案與代碼庫本身保持在一起(在crontab實用程序的情況下是不可能的)。

希望這對某人有所幫助或為他們提供指導。

暫無
暫無

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

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