2014-01-21 36 views
0

我有一个JEE7 web应用程序,它使用jax-ws注释来定义一些服务,并使用spring框架。根据请求到达时为线程分配一个名称

我希望在请求到达时为请求提供服务的线程分配一个选项名称。

我想过把Thread.currentThread().setName(“”),这工作得很好,如果我把这一行放在每个@path注释的方法中,但在每个方法中添加相同的代码是没有意义的。我正在考虑把它放在早期阶段。

是否有某种“@onrequest”注释来定义一些通用于所有请求的代码?

在此先感谢。

回答

1

我得到这个工作与过滤器。我只是在web.xml中声明了一个新的过滤器,然后我实现了过滤器类。

在web.xml:

<filter> 
    <filter-name>threadRenamingFilter</filter-name> 
    <filter-class>RestRequestFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>threadRenamingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

在过滤器类:

import java.io.IOException; 
import java.util.Date; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class RestRequestFilter implements Filter { 

    private final Log log = LogFactory.getLog(this.getClass()); 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { 
     //Before request execution 
     Date now = new Date(); 
     Long startTime = now.getTime(); 
     String newName = startTime.toString(); 
     log.trace("Thread " + newName + " started at: " + now.toString()); 
     //renaming of the thread with the time of spawn 
     Thread.currentThread().setName(newName); 
     //Request execution 
     arg2.doFilter(arg0, arg1); 
     //After request execution 
     now = new Date(); 
     Long endTime = now.getTime(); 
     Long executionTime = endTime - startTime; 
     log.trace("Thread " + newName + " end at: " + now.toString()); 
     log.debug("Thread " + newName + " completed in: " + executionTime + "ms"); 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    } 

} 
0

可以使用拦截器来处理,基本上你需要写一个实现类: http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html

,并将其连接弹簧。然后在postHandle或preHandle方法中,你可以做你想做的事情; )

下面是一些教程如何做到这一点: http://viralpatel.net/blogs/spring-mvc-interceptor-example/

你也可以看一看过滤器。

+0

我只是在想这个问题。我一定会试着让你知道。非常感谢。 – fnqlo

+0

我试图将该拦截器添加到cxf servlet中,但它不起作用。我需要一些cxf。 – fnqlo

+0

然后可能过滤器会在你的代码有帮助之前运行? – freakman