我正在使用grails 2.4.4开发Web应用程序,而Grails(使用jetty插件)大约需要20秒才能初始化并使应用程序可用。
我可以在相当长的时间内使用,但是对于较旧的硬件来说,它可以用3分钟来启动整个事情,我需要它更快,因为一旦服务器启动,性能良好而不是问题。
在SO中发现,扫描servlet注释的jar可能是问题,并禁用WEB-INF / lib中的类,并将其添加到应用程序上下文xml:
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
<Arg>nothing.jar$</Arg>
</Call>
这有助于将时间从16秒减少到13秒。 还尝试用servlet 2.5配置而不是3.0(并移动到jetty 7)来尝试进一步改进这一点,因为注释扫描是一个servlet 3.0功能,但加速很小(大约1s)。
我的目标是将这个时间缩短到6秒,因为在我测试过的最旧的硬件中花了大约3分钟所以它大约慢了10倍,1分钟的启动时间在某种程度上是可以容忍的。
我对如何实现这一点感到有些失落。通过日志查看上下文初始化大约需要2000毫秒
2017-02-08 02:15:08,318 [main] INFO context.ContextLoader - Root WebApplicatio nContext:初始化在2001年完成ms
有没有可能加快这个速度?
答案 0 :(得分:1)
如果您正在使用Jetty 9.x,那么因为它实现了Servlet 3.1(需要它),因此知道类路径/字节码扫描是一项要求。
使用org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern
仅跳过WEB-INF/lib
中的这些广告,但您的容器类路径仍在扫描中(意味着活动Grails环境中的所有内容)。
注意:您不应该从构建工具(maven,grails等)中获取生产服务器,因为这会带来巨大的性能和安全风险。
不可能通过交换servlet支持jar来改变扫描行为(实际上,你不能使用带有Jetty的Servlet 2.5 jar,它将彻底失败)。您实际使用Servlet 2.5 jar交换正在改变您的应用程序支持级别,而不是Jetty中的行为。
但一切都没有丢失,你可以&#34;预先计算&#34;扫描要求并使用Jetty 9的quickstart
features启动应用程序,通过提供它所需的内容,避免每次启动时重复扫描。
云提供商大量使用快速启动技术来近乎启动Web应用程序(通常为500毫秒)。
注意:如果您使用的是hibernate,spring,cdi或其他具有自己Annotations的库,那么该库通常会执行另一个字节码扫描步骤,而不是Jetty。