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

问题描述:

此线程似乎死了:http://groups.google.com/group/google-appengine-java/browse_thread/thread/80d014fd5abd526fAppEngine上的Spring:应用程序启动缓慢并且.....死亡?

这里发生了什么:

  • 局域,通过MVN GAE:运行,应用程序完美的作品;
  • 我将应用程序部署到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工作:-(

我相信简单的答案是支付服务和创建一个resident instance,那么你将不会受到旋转-up /拆除它可以是弹簧尤其是昂贵的。

另一种选择是修剪你的应用程序,所以它并不需要这么长时间来启动。

+0

它看起来像一个很好的解决方案,但在这个“测试”阶段,我不会支付任何费用。谢谢! :)现在,我创建了一个cron作业,它可以让我的应用程序保持活跃....看起来也不错。 – 2012-03-07 08:08:38

+0

在我昨天看到的一些谷歌文档中(失去了链接),他们说他们可以识别用于保持应用程序温暖的cron作业。不知道他们会怎么做,但只是想我会提出来。 – digitaljoel 2012-03-07 15:26:13

+0

保持我的应用程序温暖会怎么样?!? – 2012-03-07 15:32:12

您可以使用warmup requests,使您的实例最多速度在发送第一个用户请求之前

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

+0

谢谢,虽然这是一个很好的建议,但这不是答案 – 2012-03-07 08:07:32

让我们明白一点,热身请求并不能解决DeadlineExceededException错误。

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

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

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

启动成本主要是由于classpath上的类加载和资源加载造成的。 任何扫描类/资源的类路径加载缓慢。

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

-lp

+0

我同意热身请求不会使启动更快。但是从我的实验来看,jar扫描只需要3秒钟(在F1上),jar的加载实际上大约是7 – ZiglioUK 2014-02-17 23:20:40