[英]Grails Quartz2 job stops randomly
我遇到一種情況,我的Grails應用程序中的一項作業會在沒有任何明確原因的情況下停止運行。 沒有拋出異常。 我們正在使用Grails 2.2.3和Quartz2插件。 有趣的是,所有其他作業仍在繼續運行; 只有一項特定的工作一次又一次地凍結。 該工作會調用第三方REST API調用,有時會給出非常延遲的響應,並且在少數情況下也完全沒有響應。 所有作業都是並發= false 。 有人可以指出我正確的方向嗎? 自從我努力解決此問題以來已經過去了兩天。 我嘗試過的幾件事:
尚未能夠解決該問題,並且現在耗盡了所有想法。 是否有人遇到過這種情況並有一些技巧要分享。 謝謝。
注意:現在,我們已刪除了對第三方REST API的調用,該調用花費了很長時間才能查看作業是否可以長時間正常運行。 我猜服務器有時會終止耗時太長或定期超時的進程。
我們已經能夠解決這個難題。 問題在於,對第三方服務器之一的API調用在長達40至50分鍾的時間內未獲得響應,此后服務器將超時並關閉連接。 我們在作業的每次運行中都使用了多線程,由於某些“笨拙”的實現,它沒有給我們帶來真正的“ 並發=假 ”行為。 因此,在某種程度上,我們與該第三方服務器有成千上萬的開放式連接,而對於大多數請求根本沒有響應(在40-50分鍾之內)。 這只是我們的猜測,一段時間后,該特定作業/計划程序將凍結。
我們能夠找到該問題的兩種解決方案:
利用我們的傳出API請求實現更短的連接超時和讀取超時。 在此處 閱讀 連接超時和閱讀超時之間的區別。 這是我們編寫的代碼:
URL url =新URL(urlString)
HttpURLConnection httpURLConnection =(HttpURLConnection)url.openConnection()httpURLConnection.setConnectTimeout(5 * 1000 * 60)
httpURLConnection.setReadTimeout(8 * 1000 * 60)
我們能夠成功測試的第二個解決方案是通過從Linux crontab實用程序調用應用程序的action / url來進行API調用。 我們要做的是在我們的應用程序中點擊一個特定的URL,這反過來又使第三方調用了API,因此,從某種意義上說,我們從應用程序中刪除了整個石英調度程序/插件的依賴關系,即我們不在此使用石英調度程序案件。 這種方法的唯一缺點是,我們從應用程序代碼庫之外觸發了REST API調用。 因此,如果我們將應用程序的WAR部署到另一台計算機上,則我們也必須配置Linux crontab。
我們最終實現了第一個解決方案(連接/讀取超時解決方案),因為它將解決方案與代碼庫本身保持在一起(在crontab實用程序的情況下是不可能的)。
希望這對某人有所幫助或為他們提供指導。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.