WebUtils.getSessionMutex Spring (javax.servlet.http.HttpSession) и HttpSessionMutexListener по-прежнему актуальны - PullRequest
3 голосов
/ 07 декабря 2011

Я хотел бы знать, действительно ли прослушиватель HttpSessionMutexListener среды Spring Framework по-прежнему актуален в современных серверах приложений / веб-контейнерах (скажем, в 2,5+ серверах спецификаций сервлетов, таких как Tomcat 6 или Tomcat 7) для блокировки объекта сеанса в кластерных средах (т. е. среди разных JVM), или они решают проблему параллелизма только в кластеризованных средах для 2.3 (или предыдущих) контейнеров спецификаций сервлета, и теперь это не нужно?

1 Ответ

6 голосов
/ 12 декабря 2011

Я думаю, вы даете больше энергии сеансовому мьютексу, чем оно того заслуживает. Это просто атрибут сеанса, хранящийся под открытым именем WebUtils.SESSION_MUTEX_ATTRIBUTE, который предназначен для использования в выражении для оператора synchronized. Я не совсем уверен, как его можно использовать для «блокировки объекта сеанса в кластерных средах». Вот фрагмент использования из собственного кода Spring:

HttpSession session = request.getSession(false);
if (session != null) {
    Object mutex = WebUtils.getSessionMutex(session);
    synchronized (mutex) {
        return handleRequestInternal(request, response);
    }
}

Ссылка на объект mutex в одной JVM не будет доступна для другой JVM, поэтому получение ее блокировки не повлияет на код, выполняемый в другой JVM. Однако спецификация сервлета содержит следующее:

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

Это требование существует по крайней мере начиная с версии 2.3 и может привести к тому, что распределенное приложение будет вести себя так, как если бы мьютекс Spring что-то делал, хотя фактически это контейнер, который принудительно обрабатывает запросы одной JVM одновременно. 1013 *

Кроме того, это напоминает мне о посте, который я сделал для интереса параллелизма несколько лет назад и который ссылается на мьютекс сеанса Spring:

Статья JTaP о веб-приложениях с отслеживанием состояния

Обновление на основе комментария:

Предположим, что JVM-1 и JVM-2 составляют два узла в кластере. Также предположим, что request-1 и request-2 участвуют в одном сеансе. Если запрос-1 обрабатывается в JVM-1, то запрос-2 не может быть обработан в JVM-2, пока запрос-1 не будет выполнен. Однако запрос-2 может обрабатываться одновременно JVM-1.

Для случая, когда запросы обрабатываются в разных JVM, подразумевается, что любые изменения сеанса, вызванные первым запросом (JVM-1), будут видны второму запросу (JVM-2).

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