部署谷歌应用程序时出现500服务器错误

时间:2013-04-29 13:37:42

标签: java multithreading google-app-engine servlets

这是我的第一个谷歌应用引擎servlet,我想让它抓取一个网站,所以我在app引擎中使用backgroundThread创建线程,我的问题是当我在localhost上运行这个应用程序时:8888它正常工作并执行任务它应该这样做。

Youm7 youm7Crawler = new Youm7(); log.info("start 1"); Thread youm7Thread = ThreadManager.createBackgroundThread(youm7Crawler); log.info("start 2"); log.info("start 3"); youm7Thread.start();  但是一旦我尝试在服务器上部署它,我得到一个错误500服务器,我在日志中得到这个严重错误

    `Uncaught exception from servlet
java.lang.IllegalStateException: This feature is only available to backend instances.
    at com.google.appengine.api.system.SystemServiceImpl.translateException(SystemServiceImpl.java:40)
    at com.google.appengine.api.system.SystemServiceImpl.startBackgroundRequest(SystemServiceImpl.java:28)
    at com.google.apphosting.runtime.ApiProxyImpl$BackgroundThreadFactory.newThread(ApiProxyImpl.java:1125)
    at com.google.appengine.api.ThreadManager.createBackgroundThread(ThreadManager.java:88)
    at newscrawler.crawlerServlet.doGet(crawlerServlet.java:30)
    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:125)
    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.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:57)
    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:266)
    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:146)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:438)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:774)
    at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:722)
2013-04-29 06:27:25.205 /myreminderapp 200 66ms 0kb Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31`

那么我应该怎么做才能使它在服务器上工作,就像在我的本地

一样

1 个答案:

答案 0 :(得分:0)

GAE的部署可以在两种类型的机器上,一种是前端(默认),它们有很多限制,但它们可以非常快速地扩展。 其他的是backends,后端实例没有前端那么多的限制。 由于您的应用程序使用Threds,因此它只能作为后端实例运行。 您需要通过xml文件配置应用程序后端,更多详细信息here 您需要将其部署为后端实例,当您通过google eclipse插件上传应用程序时,该窗口可以选择要部署哪些前端和后端。

- 希望这有帮助