我有一个应用引擎项目。我有一个 cron 任务,它将尝试每 15 分钟打开一个 url(在我拥有的另一台服务器上,运行码头):
<cron>
<url>/pingjetty</url>
<description>Jetty up check.</description>
<schedule>every 15 minutes</schedule>
</cron>
我会在 25% 的时间内得到 SocketTimeoutException。我知道当应用引擎报告超时时,码头实例已启动并正在运行。查看码头日志,看起来这些请求永远不会到达它:
[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 作业在我的应用程序引擎实例上触发,为 /pingjetty 调用本地 servlet。
- 这个 servlet 尝试打开 url:“www.example.com/jettyapi/echo”,它位于我的 jetty 实例上。
- 连接在 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%,但随后的重试工作正常。自从添加这个之后,我还没有完全失败。但这仍然令人困惑。