2016-11-09 26 views
1

我有下面的代碼,它工作正常。我的問題是天氣下面的代碼是線程安全或不。通過閱讀Servlet Filter和Container * Filter概念,我感到困惑。ContainerRequestFilter和ContainerResponseFilter線程安全嗎?

如何使此過濾器爲線程安全?

@Provider 
public class ResourceLoggingFilter implements ContainerRequestFilter, ContainerResponseFilter { 

@Context 
private ResourceInfo resourceInfo; 

@Context 
private HttpServletRequest servletRequest; 

@Inject 
private java.util.logging.Logger logger; 

public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
    String stTime = (String) requestContext.getProperty("StartTime"); 
    logger.log(Level.INFO,"<== Leaving Resource Path: "+ requestContext.getUriInfo().getPath()); 
    logger.log(Level.INFO,"<== Leaving Resource Method: "+ resourceInfo.getResourceMethod().getName()); 
    logger.log(Level.INFO,"<== Leaving Resource class: "+ resourceInfo.getResourceClass().getCanonicalName()); 
    logger.log(Level.INFO,"<== Leaving Session id: "+ servletRequest.getSession().getId()); 
    if (null == stTime || stTime.length() == 0) { 
     logger.log(Level.INFO,"start-time not captured or cleared"); 
     stTime = "0"; 
    } 
    long startTime = Long.parseLong(stTime); 
    long executionTime = System.nanoTime() - startTime; 
    logger.log(Level.INFO,"Total execution time : "+executionTime+" nano seconds." ); 

} 

public void filter(ContainerRequestContext requestContext) throws IOException { 
    requestContext.setProperty("StartTime", String.valueOf(System.nanoTime())); 
    logger.log(Level.INFO,"==> Entering Resource Path: "+ requestContext.getUriInfo().getPath()); 
    logger.log(Level.INFO,"==> Entering Resource Method: "+ resourceInfo.getResourceMethod().getName()); 
    logger.log(Level.INFO,"==> Entering Resource class: "+ resourceInfo.getResourceClass().getCanonicalName()); 
    logger.log(Level.INFO,"==> Entering Session id: "+ servletRequest.getSession().getId()); 

} 

} 

編輯 是好有private volatile String stTime;聲明,讓stTime可以是線程安全的?

回答

1

它已經是線程安全的。 ResourceInfoHttpServletRequest都是代理(使用線程本地),而java.util.Logger上的方法是線程安全的。

見ASLO:

+0

如果多個響應訪問字符串stTime =(字符串)requestContext.getProperty( 「開始時間」); ?? – CHowdappaM

+0

它是特定的請求。每個請求都得到它自己的線程。 –

+0

感謝您的快速響應,我在想,filter()在響應中不是線程安全的,而stTime是由另一個響應/線程重寫,而第一個線程計算底部的執行時間。 – CHowdappaM