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

ContextLoader - Root WebApplicationContext initialized 3 times on ubuntu tomcat

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

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 之间的 tomcat 行为对于同一个 WAR 文件有这种差异?

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