Гарантируется ли поток для всего запроса, обрабатываемого сервлетом? - PullRequest
3 голосов
/ 27 января 2011

Я сталкиваюсь с ситуацией, когда использую статическую переменную ThreadLocal для хранения компонента, который содержит различные значения метрик из разных классов в течение жизненного цикла запроса. В фильтре я создаю bean-компонент и устанавливаю его в локальной переменной потока и удаляю его из локальной переменной потока в том же фильтре после обработки запроса. Я сталкиваюсь с тем, что бин содержит значения из других запросов! Единственным объяснением этого является поток, который используется совместно для обработки нескольких запросов одновременно. Так что вопрос в названии.

Ответы [ 3 ]

6 голосов
/ 27 января 2011

Хотя один поток обычно обрабатывает один запрос (если говорить о tomcat, наверняка), поток может обрабатывать несколько запросов с течением времени, но без завершения существующего запроса, если не используются включения / пересылки.

Я бы ОЧЕНЬ строго рекомендовал вам использовать атрибут (setAttribute ()) указанного запроса с вашим бином и использовать его для профилирования.Если вы не можете предоставить запрос к различным методам ... ну, вы застряли с ThreadLocal [что не так уж и плохо].

В качестве альтернативы вы можете опубликовать код, как установить / удалить threadLocalbean.

Имейте в виду, что вам также необходимо некоторое управление этим компонентом (он не будет доступен вне запроса).

Редактировать: забыл спросить: используете ли выпопытаться / наконец вызвать doFilter (...)?

код должен быть таким

installBean();
try{
  chain.doFilter(req, resp);
}finally{
 Bean b = deinstallBean();
 useTheMetrics(b);
//potentially, process exception, etc
}
2 голосов
/ 27 января 2011

Возможно также, что ваш фильтр не всегда вызывается в той последовательности, в которой вы ожидаете.Потоки используются повторно для обработки нескольких запросов один за другим, поэтому, если удаление значения в ThreadLocal не произойдет, оно все равно будет там, когда поток обработает свой следующий запрос.

1 голос
/ 27 января 2011

Да, вы можете предположить, что отдельный запрос будет обрабатывать каждый запрос.

Используйте блок finally, чтобы очистить (установить на null) ThreadLocal в фильтре после обработки остальныхцепь.Это предотвратит смешение данных из предыдущих запросов с текущим запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...