谷歌应用程序引擎-http请求/响应



我在谷歌应用引擎(GAE)上托管了一个Java web应用程序。用户单击一个按钮,就会得到一个包含100行的数据表。在页面的底部,有一个"进行Web服务调用"按钮。单击它,应用程序将一次占用一行,并使用URLConnection类进行第三方web服务调用。那部分工作正常。

然而,由于HttpRequest/Response周期有60秒的限制,所有100个事务都不会通过,因为超时发生在第50行左右

如何创建循环并发送Web服务调用,而无需用户多次单击"进行Web服务调用"?

有没有办法在60秒内停止循环,然后在不提交HttpResponse的情况下重新开始?(我不想使用异步的谷歌后端)。

此外,GAE是否支持文件上传(从文件而不是数据库中获取100行)

谢谢。

根据注释添加一些代码:

URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setConnectTimeout(35000);
connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
connection.setRequestProperty("Authorization", encodedCredentials);
// Send post request
DataOutputStream wr = new DataOutputStream(
connection.getOutputStream());
wr.writeBytes(submitRequest);

这一切都取决于这些调用的结果。

如果结果没有返回到UI,则无需阻止它。您可以使用Tasks API创建100个任务并向用户返回响应。这最多需要几秒钟。额外的好处是,您可以通过使用任务并行拨打多达10个电话。

如果结果必须返回给用户,您仍然可以使用多达10个线程来并行处理尽可能多的请求。希望这能让你的时间减少到1分钟以下,但你不能保证,因为你依赖于目前可能不可用的第三方资源的响应。您必须实现自己的重试机制。

还要注意的是,用户不习惯等待网站几分钟的响应。当在不阻塞客户端代码的情况下处理最后一个请求后通知用户时,您可以考虑另一种方法。

是的,你可以从应用引擎上的文件加载数据。

尝试使用异步urlpetch调用:

LinkedList<Future<HttpResponse>> futures;
// Start all the request
for (Url url : urls) {
HttpRequest request = new HttpRequest(url, HTTPMethod.POST);
request.setPayload(...)
futures.add(urlfetchservice.fetchAsync(request);
}
// Collect all the results
for (Future<HttpResponse> future : futures) {
HttpResponse response = future.get()
// Do something with future
}

相关内容

  • 没有找到相关文章