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 /拆除它可以是弹簧尤其是昂贵的。
另一种选择是修剪你的应用程序,所以它并不需要这么长时间来启动。
您可以使用warmup requests,使您的实例最多速度在发送第一个用户请求之前
注意:这并不影响第一次请求的延迟时间当你没有实例运行时,它只有在新实例(超出现有实例)被启动时才会有帮助。但是,它应该有助于解决第一个请求中的500错误。
谢谢,虽然这是一个很好的建议,但这不是答案 – 2012-03-07 08:07:32
让我们明白一点,热身请求并不能解决DeadlineExceededException错误。
您看到的DeadlineExceededException是由于启动时间超过了60秒。
热身请求不会使启动更快。
付费实例不会使启动更快。
启动成本主要是由于classpath上的类加载和资源加载造成的。 任何扫描类/资源的类路径加载缓慢。
减少扫描时间取决于您的应用在启动时加载的框架。通常的嫌疑人是Spring和JSF。
-lp
我同意热身请求不会使启动更快。但是从我的实验来看,jar扫描只需要3秒钟(在F1上),jar的加载实际上大约是7 – ZiglioUK 2014-02-17 23:20:40
它看起来像一个很好的解决方案,但在这个“测试”阶段,我不会支付任何费用。谢谢! :)现在,我创建了一个cron作业,它可以让我的应用程序保持活跃....看起来也不错。 – 2012-03-07 08:08:38
在我昨天看到的一些谷歌文档中(失去了链接),他们说他们可以识别用于保持应用程序温暖的cron作业。不知道他们会怎么做,但只是想我会提出来。 – digitaljoel 2012-03-07 15:26:13
保持我的应用程序温暖会怎么样?!? – 2012-03-07 15:32:12