2014-01-21 67 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