У меня есть код ниже, он отлично работает. Мой вопрос - погода ниже кода, потокобезопасная или нет. Читая фильтры сервлетов и контейнеров *, я смущен.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 может быть поточно ??
Что делать, если несколько ответов доступа Строка stTime = (String) requestContext.getProperty ("время_запуска"); ?? – CHowdappaM
Это конкретный запрос. Каждый запрос получает свою собственную нить. –
Спасибо за быстрый ответ, я думаю, filter() в ответе не является потокобезопасным, а stTime - переопределением другого ответа/потока, а первый поток вычисляет время выполнения внизу. – CHowdappaM