我有一個應用程序引擎項目。我有一個cron任務,將嘗試打開一個網址(我自己的另一臺服務器上,運行碼頭),每15分鐘:cron作業到另一臺服務器正在服務的間歇超時?
<cron>
<url>/pingjetty</url>
<description>Jetty up check.</description>
<schedule>every 15 minutes</schedule>
</cron>
我去拿的時候SocketTimeoutException 25%。我知道,當應用引擎報告超時時,碼頭實例已啓動並正在運行。縱觀碼頭日誌,它看起來像這些請求永遠也做不到:
[28/Apr/2013:12:24:59 +0000] "GET /jettyapi/echo HTTP/1.1" 200 31
[28/Apr/2013:12:40:03 +0000] "GET /jettyapi/echo HTTP/1.1" 200 31
[28/Apr/2013:12:55:04 +0000] "GET /jettyapi/echo HTTP/1.1" 200 31
---- missing entry, should be a connection attempt here around 13:10 -----
[28/Apr/2013:13:27:08 +0000] "GET /jettyapi/echo HTTP/1.1" 200 31
[28/Apr/2013:13:42:09 +0000] "GET /jettyapi/echo HTTP/1.1" 200 31
[28/Apr/2013:13:57:09 +0000] "GET /jettyapi/echo HTTP/1.1" 200 31
而僅僅是明確的,這裏的東西流:
-
我的應用程序引擎實例
- cron作業火災,呼叫本地servlet/pingjetty。
- 此servlet試圖打開url:「www.example.com/jettyapi/echo」,它位於我的碼頭實例上。
- 連接很好75%的時間 - 但25%的時間我會得到SocketTimeoutException。從應用程序引擎servlet中拋出異常,試圖與我的碼頭實例進行通信。
是否有可能從應用引擎的一方發生了什麼?過去兩年我一直在做這個cron工作,從來沒有見過這個。我將連接和讀超時增加到每個60秒。當超時發生時(其他用戶在發生超時時通過瀏覽器連接到碼頭實例),我還確保碼頭實例已啓動並提供服務。
任何想法將是巨大的,不知道在哪裏繼續調查,
感謝
-------更新---------------
我無法弄清楚發生了什麼事。我只是增加了一個重試循環到我的cron作業如下:
int tries = 3;
for (int i = 0; i < tries; i++) {
try {
openUrl("www.example.com/jettyapi/echo");
} catch (SocketTimeoutException) {
continue; // try again
}
}
所以第一次嘗試失敗25%像以前一樣,但後續重試做工精細。自從添加這個以來我沒有完全失敗。但它仍然令人困惑。
看起來一切正常:https://code.google.com/status/appengine – 2013-04-29 17:37:55
不知道什麼是錯的,但是您可能會更好,因爲cron作業每15分鐘排入一個任務並讓處理器完成該任務對服務器執行實際的HTTP請求 - 如果請求失敗,讓任務處理器返回5xx錯誤代碼,AppEngine將重試該請求。 – 2013-04-29 18:12:51
我添加了一個重試循環,它現在屏蔽了超時。所以第一個會在循環中失敗,但後續的將會通過。仍然不確定發生了什麼,但是這爲我的目的「修復」了它。 – user291701 2013-05-01 16:36:41