0

我有一个应用引擎项目。我有一个 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 

为了清楚起见,这是事情的流程:

  1. Cron 作业在我的应用程序引擎实例上触发,为 /pingjetty 调用本地 servlet。
  2. 这个 servlet 尝试打开 url:“www.example.com/jettyapi/echo”,它位于我的 jetty 实例上。
  3. 连接在 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%,但随后的重试工作正常。自从添加这个之后,我还没有完全失败。但这仍然令人困惑。

4

1 回答 1

0

您的 Cron 作业首先向 App Engine 应用中的路径 /pingjetty 发出请求,然后 App Engine 应用中的 Servlet 向您的 Jetty 实例发出请求。您在哪里看到错误消息?您是否在 App Engine 应用程序日志中看到堆栈跟踪?这意味着 Cron 作业已成功触发并向您的 App Engine 应用发送请求。

于 2013-04-29T18:50:08.507 回答