0

我有一个托管在Google App Engine(GAE)上的Java Web应用程序。用户点击一个按钮,他得到一个100行的数据表。在页面的底部,有一个“Make Web service calls”按钮。点击它,应用程序将一次一行,并使用URLConnection类进行第三方Web服务调用。那部分工作正常。Google App Engine - http请求/响应

但是,由于HttpRequest/Response周期有60秒的限制,所有100个事务都没有经过,因为超时发生在50行左右。

如何创建循环并发送Web服务调用,而用户不必单击“创建Web服务调用”多次?

有没有办法在60秒前停止循环,然后再次启动而不提交HttpResponse? (我不想使用异步Google后端)。

此外,没有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); 
+0

您可以发布它做HTTP连接的现行规范? –

+0

@DevilingMaster更新了代码 – user972391

回答

1

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

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

如果结果必须返回给用户,您仍然可以使用最多10个线程尽可能并行地处理尽可能多的请求。希望这会使你的时间在1分钟以内,但你不能保证,因为你依赖于第三方资源的反应,而这些资源目前可能不可用。你将不得不实现你自己的重试机制。

另请注意,用户不习惯等待几分钟的时间让网站回复。在处理最后一个请求之后通知用户而不会阻止您的客户端代码时,您可以考虑使用不同的方法。

是的,您可以从App Engine上的文件加载数据。

+0

是的,我需要显示结果给用户。你有链接到任何线程中的任务的例子吗?只有后端程序不是任务吗? GAE前端还可以使用任务吗? – user972391

+0

默认情况下,任务将定位您的常规(前端)实例。如果你想让它们在那里执行,你必须指定后端。至于线程,如果您使用任务,则不必执行任何操作 - 只需将您的应用配置为线程安全,并配置队列(https://cloud.google.com/appengine/docs/java/config/queue) –

0

尝试使用asynchronous urlfetch电话:

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 
} 
+0

我的应用程序是一个Java应用程序(不是Python) – user972391

+0

@ user972391- GAE Java API也有一个[异步API](https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/ API /网址撷取/ URLFetchService#fetchAsync(com.google.appengine.api.urlfetch.HTTPRequest))。 –

+0

@ user972391 - 针对Java运行时更新。 –