2014-02-25 101 views
1

我遇到了一個情況,即我的Grails應用程序中的某個作業在沒有任何明確原因的情況下停止運行。沒有異常拋出。我們正在使用Grails 2.2.3和Quartz2插件。有趣的是,所有其他的工作繼續運行;只有一個特定的工作會一次又一次地凍結。這項工作調用了第三方REST API調用,有時會給出非常延遲的響應,在少數情況下也沒有響應。所有的工作都是併發=假。有人能指引我走向正確的方向嗎?我一直在努力解決這個問題已經兩天了。很少有我嘗試過的東西:Grails Quartz2作業隨機停止

  1. 更改/簡化作業處理任務的執行情況。該工作仍然會進行REST API調用。有時候的響應時間非常長(最多20分鐘),在少數情況下我們面臨ConnectionTimeOut異常。
  2. 啓用石英測井。作業凍結並且日誌記錄不會給出任何錯誤消息。
  3. 安裝Grails石英顯示器插件。我們已將它內聯並調整爲使用Quartz2插件運行。它只是顯示通常的石英/列表。

尚未能夠解決問題,並且現在已經沒有想法了。是否有人遇到過這種情況,並有一些提示可供分享。謝謝。

注意:現在我們已經刪除了對第三方REST API的調用,該調用需要很長時間才能查看作業是否長時間運行良好。我想服務器有時會殺死那些花費太長時間或定期超時的進程。

+1

一些額外的細節會有幫助。通過策略1,您是否嘗試不再進行REST呼叫?如果是這樣,這項工作是否仍然停止?另外,你有併發=假集?如果你想做的工作沒有完成,那麼在這種情況下工作不會再次開始。另外,當您使用顯示器時,作業是否正在運行,而不是被正確觸發或完全停止? Monitor插件是否支持Quartz2?從文檔它只提到了常規的Quartz插件。 – derdc

+0

我已經編輯了關於derdc查詢的問題。 – issprof

+0

它看起來類似於http://stackoverflow.com/questions/618265/quartz-scheduler-suddenly-stop-running-and-no-exception-error –

回答

0

我們已經能夠解決這個謎題。問題在於,對其中一個第三方服務器的API調用沒有得到響應,長達40-50分鐘,之後服務器將超時並關閉連接。我們在作業的每次運行中都使用了多線程,並且由於一些「錯誤」的實現,它沒有給我們一個真正的'併發=假'行爲;所以在某種程度上,我們有成千上萬的開放式連接到這個第三方服務器,對於大多數請求根本沒有響應(40-50分鐘)。這只是我們的猜測,一段時間後,這個特定的工作/調度程序凍結。

我們能夠找出兩個解決問題的辦法:

  1. 實現更短的連接超時和讀超時與我們傳出的API請求。請閱讀連接超時讀取超時之間有什麼區別here。這是我們寫的代碼:

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

  2. 我們能夠成功測試的第二種解決方案是通過從Linux crontab實用程序調用我們的應用程序的操作/ url來調用API。我們所做的就是在我們的應用中創建一個特定的URL,然後這個URL會調用第三方API,所以我們從我們的應用中刪除了整個quartz scheduler/plugin依賴項,也就是說我們在這裏不使用quartz調度器案件。這種方法唯一的缺點是我們從應用程序代碼庫之外觸發REST API調用。因此,如果我們將應用程序的WAR部署到另一臺機器上,我們也必須配置Linux crontab。

我們終於實現的第一溶液(連接/讀超時溶液),因爲它保持在溶液withing代碼庫本身(這是不可能的crontab實用程序的情況下)。

希望這可以幫助某人或給他們指針在哪裏看。