在我的网络应用程序开始加载之前,启动Jetty会有很长的延迟(8秒)
13:50:10 [INFO] jetty-9.4.5.v20170502
13:50:18 [INFO] Scanning elapsed time=146ms
启用调试日志记录后,有两个有趣的步骤
提取依赖的war-application,毕竟花费时间(3s)
10:03:13 [DEBUG] Extracting entry = null from jar file:[..]/application-1.0.war
10:03:16 [DEBUG] Unpacked overlay: jar:file:[..]/application-1.0.war!/ to file:[..]
以及以下4s延迟:
10:03:16 [DEBUG] Service loaders found in 0ms
10:03:20 [DEBUG] loaded interface javax.servlet.ServletContainerInitializer
如何调试或影响导致4s以上延迟的原因?
的pom.xml
<dependency>
<groupId>com.company</groupId>
<artifactId>application</artifactId>
<version>1.0</version>
<type>war</type>
</dependency>
[...]
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.5.v20170502</version>
<configuration>
<webApp>
<webInfIncludeJarPattern>empty</webInfIncludeJarPattern>
<containerIncludeJarPattern>empty</containerIncludeJarPattern>
</webApp>
</configuration>
</plugin>
的web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.app.AnnotationConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
[...]
</web-app>
答案 0 :(得分:3)
你有一个更大的平均webapp(70MB的WEB-INF / lib罐子),但没有什么大的(我已经看过800MB战争文件)
有一些事情可能导致减速。
WEB-INF/lib/*.jar!/META-INF/resources/
)解压缩到WebApp临时目录@HandlesType
类javax.servlet.ServletContainerInitializer
注释中声明的注释和类型)如果您的文件系统很慢,那么上述任何一种情况都会让您失望。
注意:Jetty的DEBUG日志记录会告诉你每个时间点(甚至将字节码扫描时间分解为单个jar)
字节码扫描步骤是启动时间最常见的地方。
为&#34;空&#34;配置<containerIncludeJarPattern>
不推荐使用,这是Servlet,JSP,Taglibs运行所必需的。
The containerIncludeJarPattern
default只是servlet / jsp / taglib jars。 (需要几微秒才能扫描)
<webInfIncludeJarPattern>
也不应只是&#34;空&#34;,它至少应包含您的WEB-INF/classes
内容(又名.*/classes/.*
)。考虑将其设置为仅扫描您需要的WEB-INF/lib
个罐子。 (类似于.*/lib/spring-.*\.jar$|.*/classes/.*
)
WEB-INF/lib/*.jar
和WEB-INF/classes
中类的字节大小实际上是无关紧要的。与时间更相关的是找到的文件数量(甚至是非类文件)。
如果您使用资源罐(WEB-INF/lib/*.jar!/META-INF/resources/
),那么这是您缓慢启动的重要惩罚/来源。
你能做什么:
首先查看你的DEBUG日志,它会告诉你事情的发展时间。
接下来,如果启动时间很重要,请使用Jetty的quickstart
功能进行调查(这有两个部分,一个构建时组件,用于扫描和构建战争中包含的jetty-quickstart.xml
,以及运行时模块,查找并使用jetty-quickstart.xml
(如果找到)
最后,如果您正在使用资源罐(WEB-INF/lib/*.jar!/META-INF/resources/
),请考虑在构建期间将这些内容移出WEB-INF/lib
并进入战争中的正常位置(maven package
阶段)。这些都很方便,但有一些你不喜欢的副作用。 (还要考虑运行时资源解析冲突的问题。)