我创建了一个App Engine后端来为长时间运行的进程提供http请求。当查询引用小尺寸的输入时,后端进程按预期工作,但当输入大小较大时,后端进程超时。 query参数是App Engine BlobStore blob的url,它是后端进程的输入数据。我认为使用App Engine后端的重点是避免App Engine前端拥有的超时限制。我怎样才能避免超时?
我像这样调用后端,将连接超时长度设置为无限:
HttpURLConnection connection = (HttpURLConnection)(new URL(url + "?" + query).openConnection());
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestMethod("GET");
connection.setConnectTimeout(0);
connection.connect();
InputStream in = connection.getInputStream();
int ch;
while ((ch = in.read()) != -1)
json = json + String.valueOf((char) ch);
System.out.println("Response Message is: " + json);
connection.disconnect();
追溯(为匿名编辑)是:
Uncaught exception from servlet
java.net.SocketTimeoutException: Timeout while fetching URL: http://my-backend.myapp.appspot.com/somemethod?someparameter=AMIfv97IBE43y1pFaLNSKO1hAH1U4cpB45dc756FzVAyifPner8_TCJbg1pPMwMulsGnObJTgiC2I6G6CdWpSrH8TrRBO9x8BG_No26AM9LmGSkcbQZiilhC_-KGLx17mrS6QOLsUm3JFY88h8TnFNer5N6-cl0iKA
at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:142)
at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:43)
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:417)
at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:296)
at org.someorg.server.HUDXML3UploadService.doPost(SomeService.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
正如你所看到的,我没有得到DeadlineExceededException,因此我认为Google的限制之外的其他因素导致了超时,并且使这与该主题上类似的stackoverflow帖子不同。
我谦虚地感谢您的任何见解。
2012年2月19日更新:我想,我知道发生了什么。我应该能够让客户端无限期地等待使用GWT [或任何其他类型的客户端异步框架]异步处理程序来完成任何客户端请求,所以我不认为这是问题所在。问题是文件上传正在调用_ah / upload App Engine系统端点,然后,一旦blob存储在Blobstore中,就会调用上传服务的doPost后端来处理blob。客户端对_ah / upload的请求是超时的,因为后端没有及时返回。为了解决这个超时问题,我试图让_ah_upload服务本身成为可通过http://backend_name.project_name.appspot.com/_ah/upload访问的公共后端,但我不认为谷歌允许系统服务(如_ah / upload)作为一个系统服务运行后端。现在我的下一个方法是在触发后端处理后立即让ah_upload返回,然后在处理完成后调用另一个服务来获取我想要的原始响应。
答案 0 :(得分:0)
解决方案是将后端进程作为任务启动并将其添加到任务队列,然后在等待处理后端任务之前将响应返回给客户端(这可能需要很长时间)。如果我可以将ah_upload分配给后端,这也可以解决问题,因为clien't异步处理程序可以永远等待后端完成,但我不认为Google允许将System Servlet分配给后端。正如Paul C所提到的,客户端现在必须轮询持久的后端进程响应数据,因为任务不能像普通的servlet那样响应。