Насколько мне известно, в спецификации Servlet 3 реализована функция асинхронной обработки. Между прочим, это будет означать, что один и тот же поток может и будет использоваться повторно для обработки другого, одновременного HTTP-запроса (-ов). Это не революционно, по крайней мере, для людей, которые раньше работали с NIO.
В любом случае это приводит к еще одной важной вещи: нет ThreadLocal
переменные как временное хранилище данных запроса. Поскольку, если тот же поток внезапно становится потоком несущей для другого HTTP-запроса, локальные данные запроса будут подвергаться другому запросу.
Все это мое чистое предположение, основанное на чтении статей, у меня нет времени играть с любыми реализациями Servlet 3 (Tomcat 7, GlassFish 3.0.X и т.д.).
Итак, вопросы:
- Правильно ли я предполагаю, что
ThreadLocal
перестанет быть удобным взломом, чтобы сохранить данные запроса? - Кто-нибудь играл с любыми реализациями Servlet 3 и пытался использовать
ThreadLocal
, чтобы доказать это? - Помимо хранения данных внутри сеанса HTTP, есть ли другие подобные легкодоступные хаки, которые вы могли бы посоветовать?
EDIT: не поймите меня неправильно. Я полностью понимаю опасности и ThreadLocal
, будучи взломом. На самом деле, я всегда советую не использовать его в аналогичном контексте. Однако, верьте или нет, контекст нити использовался гораздо чаще, чем вы, вероятно, себе представляете. Хорошим примером может быть Spring OpenSessionInViewFilter
, который, согласно его Javadoc:
Этот фильтр делает сеансы Hibernate доступный через текущий поток, который будет автоопределен менеджеров транзакций.
Это не строго ThreadLocal
(не проверял источник), но уже звучит тревожно. Я могу думать о более похожих сценариях, и обилие веб-фреймворков делает это гораздо более вероятным.
Короче говоря, многие люди построили свои песчаные замки на вершине этого хачка, с осознанием или без него. Поэтому ответ Стивена понятен, но не совсем то, что мне нужно. Я хотел бы получить подтверждение того, действительно ли кто-то на самом деле пытался и смог воспроизвести неудачное поведение, чтобы этот вопрос можно было использовать в качестве ориентира для других, захваченных одной и той же проблемой.