Многопоточный доступ к сессионному компоненту с отслеживанием состояния

В спецификации EJB 3.2 сказано следующее:

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

Для меня одновременный доступ и многопоточный доступ кажутся эквивалентными. Итак, как можно выполнять одновременные вызовы EJB с отслеживанием состояния, когда использование нескольких потоков запрещено?


person Péter Szakszon    schedule 25.04.2014    source источник


Ответы (2)


Вы правы: одновременные вызовы могут выполняться только в нескольких потоках. Итак, говоря о параллелизме, задействовано несколько потоков.

В спецификации четко сказано, что контейнеру не разрешен одновременный доступ к одному экземпляру сессионного компонента с отслеживанием состояния. Если есть одновременные вызовы (из нескольких потоков), контейнер должен их сериализовать.

Обратите внимание, что, конечно, может быть несколько экземпляров этого сеансового компонента с отслеживанием состояния, к которым, конечно, могут получить доступ несколько клиентов.

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

person Seelenvirtuose    schedule 25.04.2014
comment
Означает ли это, что мне разрешено безопасно внедрять EJB с отслеживанием состояния в сервлет с аннотацией @EJB, и несколько HTTP-запросов из нескольких потоков могут вызывать один общий EJB с отслеживанием состояния, но метод SFSB никогда не будет выполняться одновременно, потому что контейнер будет сериализовать вызовы в SFSB, и если в SFSB поступит больше вызовов, пока метод уже запущен, я получу ConcurrentAccessException? - person Péter Szakszon; 25.04.2014
comment
Вы не получите исключения. Контейнер будет сериализовать все входящие вызовы (которые могут поступать одновременно) для экземпляра сессионного компонента с отслеживанием состояния. Будет только один поток, выполняющий метод одного экземпляра. - person Seelenvirtuose; 25.04.2014
comment
Я понимаю. По умолчанию все попытки доступа ждут бесконечно, чтобы получить возможность для запуска. Только если в аннотации AccessTimeout указано значение больше -1 и время ожидания попытки доступа, я получу исключение ConcurrentAccessException. - person Péter Szakszon; 25.04.2014

Сессионный компонент с отслеживанием состояния может обрабатывать одновременные запросы. Однако эти вызовы фактически не обращаются к классу bean-компонента, который вы кодировали одновременно. Сервер приложений сериализует эти запросы. Таким образом, в данный момент только один поток выполняет методы класса компонента.

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

Этот уровень параллелизма обрабатывает только запросы одного и того же сеанса. Запросы из разных сеансов обрабатываются с разными объектами.

person infiniteRefactor    schedule 25.04.2014