cron作业到另一台服务器正在服务的间歇超时?
我有一个应用程序引擎项目。我有一个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%像以前一样,但后续重试做工精细。自从添加这个以来我没有完全失败。但它仍然令人困惑。
您的Cron作业首先向App Engine应用程序中的路径/ pingjetty发出请求,然后App Engine应用程序中的Servlet向您的Jetty实例发出请求。你在哪里看到错误信息?您是否在App Engine应用程序日志中看到堆栈跟踪?这意味着Cron作业正在成功解锁并向您的App Engine应用发送请求。
啊,是的,我没有说清楚 - cron的工作肯定是解雇,并且执行了本地servlet(ping了码头实例)。这是报告SocketTimeoutException的本地servlet。 – user291701 2013-04-29 19:53:05
看起来一切正常: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