AppEngine上的Spring:应用程序启动缓慢和死亡?

时间:2012-03-06 22:19:43

标签: spring google-app-engine

这个帖子似乎已经死了:http://groups.google.com/group/google-appengine-java/browse_thread/thread/80d014fd5abd526f

以下是发生的事情:

  • 本地,通过mvn gae:run,应用程序完美运行;
  • 我将应用程序部署到GAE;
  • 我第一次拨打“/”网址时,我会等很多时间,但没什么奇怪的:应用正在初始化,除非它以500错误结束;
  • 我继续使用我的应用....一切都是对的;
  • 我停止使用应用程序3个小时(例如);
  • 我回来使用它......它死了!初始化需要花费大量时间!这太可怕了!再次出现500错误

异常堆栈跟踪是:

Uncaught exception from servlet
javax.servlet.UnavailableException: com.google.apphosting.api.DeadlineExceededException: This request (fc36c7e0f23da9e6) started at 2012/03/06 21:26:41.562 UTC and was still executing at 2012/03/06 21:27:42.117 UTC.
    at org.mortbay.jetty.servlet.ServletHolder.makeUnavailable(ServletHolder.java:415)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:458)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:202)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:171)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:422)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:679)

GAE java团队还没有解决这个问题吗?

我该怎么办?我想避免设置一个每5分钟轮询我的网址的cron工作: - (

3 个答案:

答案 0 :(得分:3)

我认为简单的答案是为服务付费并创建一个resident instance,然后你就不会受到旋转/拆卸的影响,这对弹簧来说尤其昂贵。

另一种选择是修剪你的应用程序,这样就不需要很长时间才能启动。

答案 1 :(得分:3)

让事情变得清晰,热身请求无法解决DeadlineExceededException错误。

您看到的DeadlineExceededException是由于启动时间超过60秒。

预热请求不会使启动更快。

付费实例不会让启动更快。

启动成本主要是由于类路径上的类加载和资源加载。 扫描类路径以获取类/资源的任何内容都很慢。

减少扫描时间取决于您的应用在启动时加载的框架。通常的嫌疑人是Spring和JSF。

-lp

答案 2 :(得分:2)

您可以使用warmup requests在发送第一个用户请求之前使您的实例加快速度。

注意:当没有实例运行时,这不会影响第一个请求的延迟时间,只有在新实例(超出现有实例)被启动时才会有所帮助。但是,它应该有助于第一次请求时出现500错误。

相关问题