ContextLoader - 根 WebApplicationContext 在 ubuntu tomcat 上初始化 3 次

问题描述

亲爱的, 我有一个 jersey - spring api 部署在 apache tomcat 9.0.46 上。 (Jersey 处理宁静服务 JAX-RS 和 Spring 处理我所有的 bean{controllers,DAO,SessionFactory,JPA etc...})。 在 windows 上的 tomcat 9 上一切正常... 在 ubuntu tomcat 9.0.46 中部署完全相同的战争时,ContextLoader 被触发了 3 次,并且我的所有单例都被实例化了 3 次。我正在 tomcat 端口 80 和 443(https - godady 证书)上部署 api。 一旦我启动了 tomcat,战争就被部署了,端口 80 和 443 开始了(netstat -tulnp | grep java),我在日志中看到所有的单例都被实例化了。 (pool-2) Applicationcontext 类是我的自定义 spring @Configuration 类,它被触发并且访问 DB 没有任何问题

2021-06-09 14:41:52,128 1104 [main] INFO  o.s.web.context.ContextLoader - Root WebApplicationContext initialized in 905 ms
2021-06-09 14:41:53,124 2100 [pool-2-thread-1] INFO  skd.app.core.ApplicationContext - TASK::cleanExpiredStatuses

然后服务器需要几分钟(大约 10 分钟 14:41 以上然后 14:51 下面),当端口 8005 启动时,我再次看到 ContextLoader 再次被触发 2 次。

09-Jun-2021 14:51:36.196 WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [584,064] milliseconds.
09-Jun-2021 14:51:36.592 INFO [main] org.glassfish.jersey.server.ApplicationHandler.initialize Initiating Jersey application,version Jersey: 2.6 2014-02-18 21:52:53...
09-Jun-2021 14:51:37.042 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/apache-tomcat-9.0.46/webapps/skd-service.war] has finished in [588,185] ms

2021-06-09 14:51:39,388 696  [main] INFO  o.s.web.context.ContextLoader - Root WebApplicationContext initialized in 581 ms
09-Jun-2021 14:51:39.632 INFO [main] org.glassfish.jersey.server.ApplicationHandler.initialize Initiating Jersey application,version Jersey: 2.6 2014-02-18 21:52:53...
09-Jun-2021 14:51:40.013 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR deploying web application archive [/opt/apache-tomcat-9.0.46/webapps/skd-service.war]

第三次:

2021-06-09 14:51:41,989 744  [main] INFO  o.s.web.context.ContextLoader - Root WebApplicationContext initialized in 605 ms
09-Jun-2021 14:51:42.232 INFO [main] org.glassfish.jersey.server.ApplicationHandler.initialize Initiating Jersey application,version Jersey: 2.6 2014-02-18 21:52:53...
09-Jun-2021 14:51:42.602 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/apache-tomcat-9.0.46/webapps/skd-service.war] has finished in [2,590] ms

在 Windows 中一切正常,只有在部署到 ubuntu tomcat 时,我才得到这个。 有没有人知道为什么 windows 和 ubuntu 对于相同的 WAR 文件在 tomcat 行为上存在这种差异?

解决方法

我已经设法找出问题所在。该问题与 /conf/server.xml 中的 tomcat 配置有关。多个主机将触发为每个主机触发的上下文加载器。我将所有主机的默认 appBase 保留为 webapps,从而为每个主机触发我的每场战争的 ContextLoader。 ContextLoader 也会多次触发的另一个原因是在内部定义选项,除非您需要加载战争外部的内容。 我建议阅读规范: https://tomcat.apache.org/tomcat-4.1-doc/config/host.html