2011-06-09 146 views
1

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

因此,在两分钟之前,每件事情都可以。

,这是整个错误消息:

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()的想法不好?如果不是,我该如何让应用程序每两分钟检查一次网站?

预先感谢您。

回答

4

任何前端应用程序应在30秒内完成(HardDeadline)。你已经基本上2个选项,

  1. (更好的)更改应用逻辑,避免了Thread.sleep(),并使用cron.xml而启动您的应用程序每隔x分钟。在你的情况下,always-on或taskQueue根本无济于事。
  2. 更改为Backends因此您可以持续运行您的应用程序。
+0

谢谢你的回答。我是否必须从头开始重写我的代码才能使此cron.xml工作,或者我可以将cron“集成”到现有应用程序中?我想Google会收费使用Backends,对吧?我问这些问题是因为我从来没有听过/使用过cron.xml或Backends – mnish 2011-06-09 13:54:18

+0

@mnish crom.xml中的应用程序只是一个servlet。我想你只需要删除睡眠()和循环来创建单次运行的sevlet。选中[链接](http://code.google.com/appengine/docs/java/configyaml/cron。html)以获取有关cron.xml的详细信息。 – ShuaiYuan 2011-06-12 17:11:16

6

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

2

当读取时间超过60秒时,我们会发现此类错误。

为了解决这个问题,谷歌应用引擎支持“光标”。通过使用游标,你可以修复取上限,

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

0

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

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

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