【问题标题】:Spring MVC WebApp IssueSpring MVC WebApp 问题
【发布时间】:2012-09-28 17:55:13
【问题描述】:

我们正在为我们的 WebApplication 使用 Spring MVC 3。我从应用程序中看到了一个奇怪的行为。当用户执行操作(例如:按钮单击)时,我看到控制器日志记录了两次,控制器中的后续调用也是如此。我们使用的控制器是默认的,单例的。 所以,

  1. 我想打印控制器中的线程信息(比如threadName。试过Thread.getName()..是唯一的)..有什么帮助吗?

  2. 如何确保只有一个 Spring 容器 加载? -- 有什么建议吗?

log4j 道具:

    `log4j.appender.ROLL_FILE=org.apache.log4j.RollingFileAppender 
     log4j.appender.ROLL_FILE.File=/ws/was/dept/logs/${module.jvm.instance}_module.log
     log4j.appender.ROLLING_FILE.Append=true 
     log4j.additivity.ROLLING_FILE.Append=false 
     log4j.appender.ROLLING_FILE.MaxFileSize=10MB 
     log4j.appender.ROLLING_FILE.MaxBackupIndex=20 
     log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
     log4j.appender.ROLLING_FILE.layout.ConversionPattern=[module] %d - %c -%-4r [%t] %-5p %c %x - %m

Web.xml:

<display-name>module</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/spring/int/root-int-context.xml,/WEB-INF/spring/root-  context.xml</param-value>
   </context-param>
<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
      <servlet>
    <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet.xml</param-value>
      </init-param>          
     <load-on-startup>1</load-on-startup>
  </servlet>`
   <servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
 ..........
 .........
 .........

谢谢

【问题讨论】:

  • 你在使用日志库吗?
  • 更有可能是日志记录框架问题,两次记录相同的消息。你使用 Logback 还是 Log4J?可以分享一下你的配置吗?在控制器中设置一个断点,我敢打赌它只会被击中一次。

标签: multithreading spring jakarta-ee spring-mvc spring-security


【解决方案1】:
  1. 使用Thread.getId() 获取唯一的线程ID。
  2. 检查您的记录器配置 - 我猜您正在使用 log4jslfj - 您可能有多个记录器拦截消息,在父记录器中定义的附加器之上添加附加器,这可能会导致要打印两条消息 - 因此请检查您是否有该消息并将 additivity 定义为 false。

【讨论】:

    【解决方案2】:

    我想打印控制器中的线程信息(比如threadName。试过Thread.getName()..是唯一的)

    • 使用日志框架。你可以找到几个例子。查看here 配置logback

    如何确保只加载了一个 Spring 容器?

    • 我真的不明白你的意思,但是如果在你的 web.xml 中适当地定义了 contextConfigLocation,那么 Spring 容器将被正确加载

      <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
          classpath*:/META-INF/spring/*.xml 
      </param-value>
      

    【讨论】:

      猜你喜欢
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多