我在CentOS 7.2上构建了一个使用SpringBoot v1.3.6.RELEASE Tomcat 8.0.36 Java 1.8u101的Web应用程序
Web应用程序也是一个调用另一个Web应用程序的SOAP客户端.(JAX-WS RI 2.2.9)如果应用程序保持空闲状态15秒,则第一个Web服务调用将停止近2秒.似乎停顿发生在oacloader.WebappClassLoaderBase中.
闲置15秒后
16:02:36.165:委托父类加载器org.springframework.boot.loader.LaunchedURLClassLoader@45283ce2
16:02:36.170:搜索本地存储库
16:02:36.170:findResource(META-INF/services/javax.xml.soap.MetaFactory)
16:02:38.533: - >找不到资源,返回null
16:02:38.533: - >找不到资源,返回null
下一个请求没有空闲时间
16:07:09.981:委托父类装配器org.springframework.boot.loader.LaunchedURLClassLoader@45283ce2
16:07:09.984:搜索本地存储库
16:07:09.985:findResource(META-INF/services/javax.xml.soap.MetaFactory)
16:07:09.986: - >找不到资源,返回null
16:07:09.986: - >找不到资源,返回null
16:07:09.988:findResources(META-INF/services
oacloader.WebappClassLoaderBase生成的所有上述消息,它们显然是由来自JAX-WS RI的ClientSOAPHandlerTube.processRequest引起的.
你会注意到第一次调用需要2秒以上,但后续调用只需要几毫秒.我想知道是否有人经历过这种行为?
可能的解决方案:是否可以在springboot中更改tomcat使用的类加载器以使用ParallelWebappClassLoader
或者这可能是类加载器上的可重载标志的产物,但我没有看到如何在springboot中更改该标志.
当使用Jetty作为容器运行时,不会发生这种情况.
最终解决方案:(感谢Gergely Bacso)
@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
customizeTomcat((TomcatEmbeddedServletContainerFactory) container);
}
}
private void customizeTomcat(TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory) {
tomcatEmbeddedServletContainerFactory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context cntxt) {
cntxt.setReloadable(false);
} …Run Code Online (Sandbox Code Playgroud) 我有一个JSF 2应用程序,其中包含一个jar文件,该文件又在其META-INF目录中包含faces-config.xml.faces-config.xml包含阶段侦听器的声明.我想在不修改jar文件本身的情况下阻止安装此阶段侦听器.这可能吗?
我尝试了各种方法,但一直无法让它发挥作用。我也一直无法找到明确的答案。
如果这是可能的,一个简单的例子将不胜感激