【问题标题】:Tomcat Spring Web-MVC Application Re-Initializes (Double Launch)Tomcat Spring Web-MVC 应用程序重新初始化(双启动)
【发布时间】:2018-12-15 11:53:00
【问题描述】:

背景 - 我正在将一些遗留代码重构到 spring web-mvc 框架中。

我正在使用 Spring 5.0.5.RELEASE 和 tomcat 8.5.31。

我正在通过 eclipse Oxygen.3a Release (4.7.3a) 和 Fedora 28 启动应用程序。

问题 - 启动 tomcat 时,应用程序调度程序会间歇性地(大约 75% 的时间)重新启动。似乎在应用程序加载后,我收到一条完成的消息,然后重新加载。

完成第二次应用程序加载后,一切似乎都正常了。

在生产中,由于我有一些在启动时创建的计时器任务,因此这些任务往往会重复。因此我有重复的计时器任务线程在运行,这是一个问题。

——————————————第一个启动示例

2018 年 7 月 5 日 20:45:29.207 信息 [Thread-17] org.apache.coyote.AbstractProtocol.stop 停止 ProtocolHandler ["http-nio-8080"]

05-Jul-2018 20:45:29.209 INFO [Thread-17] org.apache.coyote.AbstractProtocol.stop 停止 ProtocolHandler ["ajp-nio-8009"]

2018 年 7 月 5 日 20:45:29.211 信息 [Thread-17] org.apache.coyote.AbstractProtocol.destroy 销毁 ProtocolHandler ["http-nio-8080"]

05-Jul-2018 20:45:29.212 INFO [Thread-17] org.apache.coyote.AbstractProtocol.destroy 销毁 ProtocolHandler ["ajp-nio-8009"]

05-Jul-2018 20:45:29.931 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本:Apache Tomcat/8.5.31

2018 年 7 月 5 日 20:45:29.933 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器建成时间:2018 年 4 月 27 日 20:24:25 UTC

05-Jul-2018 20:45:29.934 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器号:8.5.31.0

05-Jul-2018 20:45:29.934 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称:Linux

05-Jul-2018 20:45:29.934 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统版本:4.16.15-300.fc28.x86_64

05-Jul-2018 20:45:29.934 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 架构:amd64

05-Jul-2018 20:45:29.934 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java 主页:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171- 4.b10.fc28.x86_64/jre

05-Jul-2018 20:45:29.935 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM 版本:1.8.0_171-b10

05-Jul-2018 20:45:29.935 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM 供应商:Oracle Corporation

2018 年 7 月 5 日 20:45:29.936 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /opt/apache-tomcat-8.5.31

2018 年 7 月 5 日 20:45:29.936 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /opt/apache-tomcat-8.5.31

05-Jul-2018 20:45:29.936 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.config.file=/opt/tomcat/conf/ logging.properties

05-Jul-2018 20:45:29.937 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

05-Jul-2018 20:45:29.937 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.awt.headless=true

05-Jul-2018 20:45:29.938 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.security.egd=file:/dev/./urandom

05-Jul-2018 20:45:29.938 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djdk.tls.ephemeralDHKeySize=2048

05-Jul-2018 20:45:29.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.protocol.handler.pkgs=org.apache.catalina.webresources

05-Jul-2018 20:45:29.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dorg.apache.catalina.security.SecurityListener.UMASK=0027

05-Jul-2018 20:45:29.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Xms512M

05-Jul-2018 20:45:29.939 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Xmx2048M

05-Jul-2018 20:45:29.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-XX:+UseParallelGC

05-Jul-2018 20:45:29.940 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dignore.endorsed.dirs=

05-Jul-2018 20:45:29.941 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.base=/opt/tomcat

05-Jul-2018 20:45:29.941 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.home=/opt/tomcat

05-Jul-2018 20:45:29.941 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.io.tmpdir=/opt/tomcat/temp

2018 年 7 月 5 日 20:45:29.941 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 在 java.library 上找不到基于 APR 的 Apache Tomcat Native 库,它允许在生产环境中获得最佳性能.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]

05-Jul-2018 20:45:30.042 INFO [main] org.apache.coyote.AbstractProtocol.init 初始化 ProtocolHandler ["http-nio-8080"]

05-Jul-2018 20:45:30.053 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector 使用共享选择器进行 servlet 写入/读取

05-Jul-2018 20:45:30.061 INFO [main] org.apache.coyote.AbstractProtocol.init 初始化 ProtocolHandler ["ajp-nio-8009"]

05-Jul-2018 20:45:30.063 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector 使用共享选择器进行 servlet 写入/读取

05-Jul-2018 20:45:30.064 INFO [main] org.apache.catalina.startup.Catalina.load 初始化在 592 毫秒内处理

05-Jul-2018 20:45:30.088 INFO [main] org.apache.catalina.core.StandardService.startInternal 启动服务 [Catalina]

05-Jul-2018 20:45:30.088 INFO [main] org.apache.catalina.core.StandardEngine.startInternal 启动 Servlet 引擎:Apache Tomcat/8.5.31

2018 年 7 月 5 日 20:45:32.224 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars 至少扫描了一个 JAR 以查找 TLD,但未包含 TLD。启用此记录器的调试日志记录以获取已扫描但未在其中找到 TLD 的 JAR 的完整列表。在扫描期间跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。

2018-07-05 20:45:32 INFO o.s.w.s.DispatcherServlet:494 - FrameworkServlet 'dispatcher':初始化开始

2018-07-05 20:45:32 INFO o.s.w.c.s.XmlWebApplicationContext:590 - 刷新命名空间“dispatcher-servlet”的 WebApplicationContext:启动日期 [2018 年 7 月 5 日星期四 20:45:32 UTC];上下文层次结构的根

2018-07-05 20:45:32 INFO o.s.b.f.x.XmlBeanDefinitionReader:316 - 从 ServletContext 资源 [/WEB-INF/dispatcher-servlet.xml] 加载 XML bean 定义

(这里还有更多内容,只是想展示给 TLD 和调度程序初始化......)

——————第二次发布示例

(第一次启动以 Spring URL 映射消息结束...)

2018-07-05 20:28:34 信息 oswsmmaRequestMappingHandlerMapping:547 - 将“{[/manualArtifact],methods=[GET]}”映射到公共 java.lang.String com.deorc.controller.ViewManualController.manualArtifact (javax.servlet.http.HttpServletRequest,org.springframework.ui.Model)

2018-07-05 20:28:34 信息 oswsmmaRequestMappingHandlerMapping:547 - 将“{[/manualBonuses],methods=[GET]}”映射到公共 java.lang.String com.deorc.controller.ViewManualController.manualBonuses (javax.servlet.http.HttpServletRequest,org.springframework.ui.Model)

2018-07-05 20:28:35 信息 oswsmmaRequestMappingHandlerAdapter:574 - 寻找 @ControllerAdvice:命名空间“dispatcher-servlet”的 WebApplicationContext:启动日期 [2018 年 7 月 5 日星期四 20:28:27 UTC] ;上下文层次结构的根

2018-07-05 20:28:35 信息 oswsmmaRequestMappingHandlerAdapter:574 - 寻找 @ControllerAdvice:命名空间“dispatcher-servlet”的 WebApplicationContext:启动日期 [2018 年 7 月 5 日星期四 20:28:27 UTC] ;上下文层次结构的根

2018-07-05 20:28:35 INFO o.s.w.s.h.SimpleUrlHandlerMapping:373 - 将 URL 路径 [/resources/**] 映射到处理程序 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'

2018-07-05 20:28:35 INFO o.s.w.s.DispatcherServlet:509 - FrameworkServlet 'dispatcher':初始化在 7348 毫秒内完成

2018 年 7 月 5 日 20:28:37.167 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars 至少扫描了一个 JAR 以查找 TLD,但未包含 TLD。启用此记录器的调试日志记录以获取已扫描但未在其中找到 TLD 的 JAR 的完整列表。在扫描期间跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。

2018-07-05 20:28:37 INFO o.s.w.s.DispatcherServlet:494 - FrameworkServlet 'dispatcher':初始化开始

2018-07-05 20:28:37 INFO o.s.w.c.s.XmlWebApplicationContext:590 - 刷新命名空间“dispatcher-servlet”的 WebApplicationContext:启动日期 [2018 年 7 月 5 日星期四 20:28:37 UTC];上下文层次结构的根

2018-07-05 20:28:37 INFO o.s.b.f.x.XmlBeanDefinitionReader:316 - 从 ServletContext 资源 [/WEB-INF/dispatcher-servlet.xml] 加载 XML bean 定义

——————————————————

注意:我不知道为什么我会收到两个控制器建议信息日志,其中提供了“dispatcher-servlet”的启动日期。而且我不确定这是否是问题所在。

在初始化完成和启动之间唯一记录的项目是来自 Tomcat 的关于 TLD 扫描程序的信息消息。这似乎表明第二次发射的开始。在第一次初始化之前存在相同的 TLD 消息。因此,我认为这不是问题。我尝试关闭 TLD 扫描但未成功。

任何建议或建议将不胜感激。

【问题讨论】:

    标签: spring spring-mvc tomcat8 dispatcher


    【解决方案1】:

    我终于能够解决这个问题。虽然,我不明白为什么会发生这种情况。问题是我如何在 web.xml 中定义我的 servlet。

    以前,我有:

      <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>10</load-on-startup>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    

    现在改为:

       <servlet>
        <servlet-name>dark-expanse-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>dark-expanse-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    

    1) &lt;load-on-startup&gt; 标签肯定会导致重新初始化。

    2) 为 contextConfigLocation 提供特定参数似乎也导致了同样的问题。

    3) 最后,我不确定这一点,我将 servlet 名称从默认的“dispatcher”更改为应用程序特定名称以及 dispatcher-servlet.xml 文件。有可能spring也使用了dispatcher。

    【讨论】:

      【解决方案2】:

      自从去年夏天解决了这个问题后,我可能应该早点发布。问题不是 Spring,而是 Tomcat 配置。问题是 Tomcat 在 server.xml 中有一个已知错误,因为它与上下文标记相关。查看 tomcat 文档中有关上下文标签使用的更多详细信息。

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 2019-09-06
        • 2017-01-31
        相关资源
        最近更新 更多