Spring MVC WebApp问题

时间:2012-09-28 17:55:14

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

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

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

  2. 如何确保只有一个Spring容器 装? - 任何建议?

  3. 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>
     ..........
     .........
     .........
    

    由于

2 个答案:

答案 0 :(得分:1)

  1. 使用Thread.getId()获取唯一的线程ID。
  2. 检查你的记录器配置 - 我猜你正在使用log4jslfj - 你可能有多个记录器拦截消息,在父记录中定义的appender上添加了appender记录器这可能会导致打印两条消息 - 因此请检查是否有这样的消息,并将additivity定义为假。

答案 1 :(得分:0)

我想在控制器中打印线程信息(比如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>