Tomcat Spring Web-MVC应用程序重新初始化(两次启动)

时间:2018-07-06 21:17:56

标签: spring spring-mvc tomcat8 dispatcher

背景- 我正在将一些旧代码重构到Spring Web-MVC框架中。

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

我正在通过Eclipse Oxygen.3a版本(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”]

2018年7月5日20:45:29.209信息[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”]

2018年7月5日20:45:29.212信息[Thread-17] org.apache.coyote.AbstractProtocol.destroy销毁ProtocolHandler [“ ajp-nio-8009”]

2018年7月5日20:45:29.931信息[main] org.apache.catalina.startup.VersionLoggerListener.log服务器版本:Apache Tomcat / 8.5.31

2018年7月5日20:45:29.933信息[main] org.apache.catalina.startup.VersionLoggerListener.log服务器内置:2018年4月27日20:24:25 UTC

2018年7月5日20:45:29.934信息[main] org.apache.catalina.startup.VersionLoggerListener.log服务器编号:8.5.31.0

2018年7月5日20:45:29.934信息[main] org.apache.catalina.startup.VersionLoggerListener.log操作系统名称:Linux

2018年7月5日20:45:29.934信息[main] org.apache.catalina.startup.VersionLoggerListener.log操作系统版本:4.16.15-300.fc28.x86_64

2018年7月5日20:45:29.934信息[main] org.apache.catalina.startup.VersionLoggerListener.log体系结构:amd64

2018年7月5日20:45:29.934信息[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

2018年7月5日20:45:29.935信息[main] org.apache.catalina.startup.VersionLoggerListener.log JVM版本:1.8.0_171-b10

2018年7月5日20:45:29.935信息[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

2018年7月5日20:45:29.936信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Djava.util.logging.config.file = / opt / tomcat / conf / logging.properties

2018年7月5日20:45:29.937信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Djava.util.logging.manager = org.apache.juli.ClassLoaderLogManager

2018年7月5日20:45:29.937信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Djava.awt.headless = true

2018年7月5日20:45:29.938信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Djava.security.egd = file:/ dev /./ urandom

2018年7月5日20:45:29.938信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Djdk.tls.ephemeralDHKeySize = 2048

2018年7月5日20:45:29.939信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Djava.protocol.handler.pkgs = org.apache.catalina.webresources

2018年7月5日20:45:29.939信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Dorg.apache.catalina.security.SecurityListener.UMASK = 0027

2018年7月5日20:45:29.939信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Xms512M

2018年7月5日20:45:29.939信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Xmx2048M

2018年7月5日20:45:29.940信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-XX:+ UseParallelGC

2018年7月5日20:45:29.940信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Dignore.endorsed.dirs =

2018年7月5日20:45:29.941信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Dcatalina.base = / opt / tomcat

2018年7月5日20:45:29.941信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Dcatalina.home = / opt / tomcat

2018年7月5日20:45:29.941信息[main] org.apache.catalina.startup.VersionLoggerListener.log命令行参数:-Djava.io.tmpdir = / opt / tomcat / temp

2018年7月5日20:45:29.941信息[main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent在Java.library上找不到基于APR的Apache Tomcat本机库,该库允许在生产环境中实现最佳性能。 .path:[/ usr / java / packages / lib / amd64:/ usr / lib64:/ lib64:/ lib:/ usr / lib]

2018年7月5日20:45:30.042信息[main] org.apache.coyote.AbstractProtocol.init初始化ProtocolHandler [“ http-nio-8080”]

2018年7月5日20:45:30.053信息[main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector使用共享选择器进行Servlet的读/写

2018年7月5日20:45:30.061信息[main] org.apache.coyote.AbstractProtocol.init初始化ProtocolHandler [“ ajp-nio-8009”]

2018年7月5日20:45:30.063信息[main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector使用共享选择器进行Servlet的读/写

2018年7月5日20:45:30.064信息[main] org.apache.catalina.startup.Catalina.load初始化在592毫秒内完成

2018年7月5日20:45:30.088信息[main] org.apache.catalina.core.StandardService.startInternal启动服务[Catalina]

2018年7月5日20:45:30.088信息[main] org.apache.catalina.core.StandardEngine.start内部启动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。为该记录器启用调试日志记录,以获取已扫描的JAR的完整列表,但未在其中找到TLD。在扫描过程中跳过不需要的JAR可以缩短启动时间和JSP编译时间。

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

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

2018-07-05 20:45:32信息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信息o.s.w.s.h.SimpleUrlHandlerMapping:373-将URL路径[/ resources / **]映射到处理程序'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'

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

05-Jul-2018 20:28:37.167信息[localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars至少扫描了一个JAR来查找TLD,但其中没有TLD。为该记录器启用调试日志记录,以获取已扫描的JAR的完整列表,但未在其中找到TLD。在扫描过程中跳过不需要的JAR可以缩短启动时间和JSP编译时间。

2018-07-05 20:28:37信息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:启动日期[Thu Jul 05 20:28:37 UTC 2018];上下文层次结构的根

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

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

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

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

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

我终于能够解决问题。不过,我不完全了解为什么会这样。问题是我如何在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)<load-on-startup>标签肯定引起了重新初始化。

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

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

答案 1 :(得分:0)

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

相关问题