根据官方文档,如果从任务发出,则通过 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 非常失望......
更新
- 只有生产环境受到影响。在开发服务器上我没有遇到任何问题。但是,通常不会在开发服务器上强制执行超时...
- 我已经尝试过同步和异步 URLFetch 方法:结果相同。
- 我尝试过使用低级 GAE 专有 URLFetch 或 java.net URLConnection 对象:结果相同