1

根据官方文档,如果从任务发出,则通过 Google App Engine 上的 URLFetch 发出的 http 请求的超时时间为 10 分钟:

https://developers.google.com/appengine/docs/java/urlfetch/overview#Quotas_and_Limits

不幸的是,无论如何我都会遇到 250 秒(4:10 分钟)超时

我已经设置为在 Apache 上运行的简单 php 测试脚本(但我也使用 Lighttpd 对其进行了测试),我从 GAE 调用它只等待 300 秒然后返回

Http 钩子:

echo "Starting to wait\n";

$waited = 0;
while($waited < 300) {
  sleep(5);
  $waited += 5;
  echo "Waited so far $waited seconds\n";
}

echo "all done\n";

调用总是在大约 250 秒后失败,并在 GAE 日志中引发以下错误

IOException : Could not fetch URL ...

这甚至不是与超时相关的异常

另一方面,Web 服务器记录了一个成功的调用,http 返回码为 200

我用来进行调用的 Java 代码如下

HTTPRequest httpReq = new HTTPRequest(new URL(http://example.com/very-slow.php),  HTTPMethod.GET, FetchOptions.Builder.allowTruncate().doNotValidateCertificate().setDeadline(3600d));

HTTPResponse resp = null;

try {
Future<HTTPResponse> futureResp = urlService.fetchAsync(httpReq);

log.info("Aync Call request lodged, waiting for a response");

resp = futureResp.get();

log.info("Aync Call completed");

} catch(Throwable th) {
log.warning("URLFetch execution error: " + th.getMessage());
}

我尝试使用 setDeadline 方法指定各种不同的值,但运气不佳。如果我指定的值低于 250 秒,则会使用它并引发超时异常。超过 250 秒的任何内容都将被忽略,而是抛出一个通用的 IOException。

我很确定这看起来像是一个 GAE 错误,在查看了谷歌代码上的错误列表后,我吓坏了有多少未解决的错误在那里等待多年......

在这个阶段对 Google App Engine 非常失望......

更新

  1. 只有生产环境受到影响。在开发服务器上我没有遇到任何问题。但是,通常不会在开发服务器上强制执行超时...
  2. 我已经尝试过同步和异步 URLFetch 方法:结果相同。
  3. 我尝试过使用低级 GAE 专有 URLFetch 或 java.net URLConnection 对象:结果相同
4

0 回答 0