Правильно ли использовать следующий метод для получения RequestContext? - PullRequest
2 голосов
/ 03 ноября 2010

Я видел следующий код в проекте J2EE.

public class RequestContext {
    private final static ThreadLocal<RequestContext> contexts = new ThreadLocal<RequestContext>();

    /* Initialization */
    public static RequestContext begin(ServletContext ctx, HttpServletRequest req, HttpServletResponse res) {
        RequestContext rc = new RequestContext();
        ..
        contexts.set(rc);
        return rc;
    }

    public static RequestContext get(){
        return contexts.get();
    }
}

Похоже, что при наличии ThreadLocal и статическом get у нас будет простой способ получить текущий RequestContext текущего потока.

Но это обычная практика? Это правильный способ сделать это? Есть ли вероятность утечки памяти?

Почему объект, созданный ClassLoader, не имеет шанса собрать мусор сам по себе

1 Ответ

2 голосов
/ 03 ноября 2010

Я видел это в нескольких проектах для хранения некоторых элементов инфраструктуры (например, уникального идентификатора пользователя, для отслеживания сообщений журнала для определенного сеанса.

Он должен передаваться с осторожностью, потому что есливаш код работает на сервере Java EE, потоки будут объединены и использованы повторно для других сессий. Если вы не сбросите состояние ThreadLocal, у вас возникнут проблемы с непредвиденным вмешательством данных (как при наличии одного запуска потоказначения, соответствующие старшему прогону).

Итак, в вашем коде я пропускаю этот метод:

public static void reset() {
   contexts.remove();
}

Конечно, он должен использоваться где-то: обычно в том же месте, где вы его инициализируете(возможно, фильтр WebApp?)

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
  throws IOException, ServletException {

      RequestContext.begin(ctx, request, response); //initialize
      try {
         //other stuff here

         //forward request to next filter, or the servlet itself
         chain.doFilter(request, response);
      } finally {   
         RequestContext.reset();
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...