2016-11-09 4 views
1

У меня есть код ниже, он отлично работает. Мой вопрос - погода ниже кода, потокобезопасная или нет. Читая фильтры сервлетов и контейнеров *, я смущен.Are 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()); 

} 

} 

EDIT ли хорошо иметь private volatile String stTime; заявление, так что stTime может быть поточно ??

ответ

1

Это уже поточно-безопасный. И ResourceInfo, и HttpServletRequest являются прокси-серверами (с использованием локаторов потоков), тогда как методы на java.util.Logger являются потокобезопасными.

См так же:

+0

Что делать, если несколько ответов доступа Строка stTime = (String) requestContext.getProperty ("время_запуска"); ?? – CHowdappaM

+0

Это конкретный запрос. Каждый запрос получает свою собственную нить. –

+0

Спасибо за быстрый ответ, я думаю, filter() в ответе не является потокобезопасным, а stTime - переопределением другого ответа/потока, а первый поток вычисляет время выполнения внизу. – CHowdappaM