java - 谷歌应用引擎 HardDeadlineExceededError

标签 java google-app-engine exception

我在谷歌应用引擎上托管我的应用程序。我的应用程序应该做的是每两分钟连接到一个网站,解析它并使用 C2DM 将必要的信息发送到我的设备。我首先测试了我的应用程序,看看它是否可以运行一次。它工作正常。但是为了每两分钟检查一次网站,我将必要的方法放在一个 while 循环中,然后将 Thread.sleep(120000) 放在 while 循环中。它工作了一段时间,但现在我明白了: 来自 servlet 的未捕获异常 com.google.apphosting.runtime.HardDeadlineExceededError:此请求 (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.<init>(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() 的想法不好?如果不是,我如何让应用程序每两分钟检查一次网站?

提前谢谢你。

最佳答案

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

关于java - 谷歌应用引擎 HardDeadlineExceededError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6291910/

相关文章:

java - MQQueueConnection.start不会持续监听新消息

java - JDBC异常处理: warning suppression

android - GCM + AppEngine - 应用程序不接收推送通知

python - 任务队列/延迟中的 blobstore

oracle - 在PLSQL中如何获取发生异常的过程/函数名称?

java - Spring:REST 异常被捕获为 403 Forbidden 异常

java - 拦截请求时出错

java - 除 IMEI 或 IMSI 之外的手机唯一标识符?

google-app-engine - 中国的 GAE 应用程序,*.appspot.com 托管域

java - 如何调用包含异常处理程序的方法