谷歌应用引擎HardDeadlineExceededError

我在谷歌应用引擎上托管我的应用程序。 我的应用程序应该做的是每两分钟连接一个网站,解析它并使用C2DM将必要的信息发送到我的设备。 我首先测试了我的应用程序,看它是否有效。 它工作正常。 但是为了每两分钟检查一次网站,我将必要的方法放在while循环中,然后将Thread.sleep(120000)放入while循环中。 它已经捣乱了一段时间,但现在我明白了:来自servlet com.google.apphosting.runtime.HardDeadlineExceededError的未捕获exception:此请求(f6b9f0b8e1ec6f23)于2011/06/09 10:24:22.514 UTC开始,并且仍在2011年执行/ 06/09 10:24:52.824 UTC。

所以在两分钟之前,每件事都没问题。

这是整个错误消息:

Uncaught exception from servlet com.google.apphosting.runtime.HardDeadlineExceededError: This request (f6b9f0b8e1ec6f23) started at 2011/06/09 10:24:22.514 UTC and was still executing at 2011/06/09 10:24:52.824 UTC. at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:408) at java.lang.StringBuilder.append(StringBuilder.java:136) at java.lang.StringBuilder.(StringBuilder.java:110) at tripplannerServer.ParseVerstoring.parsePlanned(ParseVerstoring.java:50) at tripplannerServer.SendMessage2.geplandeVerstoring(SendMessage2.java:257) at tripplannerServer.TripplannerServerServlet.doGet(TripplannerServerServlet.java:152) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135) at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:260) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9669) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:439) at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:573) at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:448) at com.google.tracing.TraceContext.runInContext(TraceContext.java:688) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:326) at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:318) at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:446) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:636) 

知道怎么解决这个问题吗? 或者使用Thread.sleep()的想法不好? 如果不是,我如何让应用程序每隔两分钟检查一次网站?

先谢谢你。

任何前端应用都应在30秒内完成(HardDeadline)。 你基本上有2个选择,

  1. (更好的一个)更改您的应用程序逻辑,避免使用Thread.sleep()并使用cron.xml来每隔x分钟启动一次应用程序。 在您的情况下,永远在线或taskQueue根本无济于事。
  2. 更改为后端,以便您可以连续运行您的应用程序。

您不应该在App Engine前端,taskqueue或cron请求中使用Thread.sleep 。 相反,每两分钟安排一次cron作业,或者使用适当的ETA链接任务队列任务。

当提取时间超过60秒时,我们会遇到这种类型的错误。

要解决此问题,谷歌应用引擎支持“光标”。 通过使用光标,您可以修复提取限制,

如果需要那么你也可以实现内部游标即(光标内的游标)

我在生产中部署代码后第一次尝试加载网页时遇到了这个问题。 第一次加载需要花费很多时间,因此我得到了错误。

对我有用的是在我的应用程序设置(在管理菜单下)中更改性能部分中的前端实例类。 我从F1改为F2 ,问题得到解决。

完成第一次加载后,我将返回F1,因为使用其他选项会消耗更多的前端实例配额。