背景- 我正在将一些旧代码重构到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扫描。
任何建议将不胜感激。
答案 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文档以获取更多详细信息。