Я думаю, что в целом контракт метода заключается в том, чтобы обеспечить связь между перехватчиками + контекстами веб-сервиса и bean-компонентами. Таким образом, контекст должен быть доступен для всего кода, , если не создан новый контекст вызова . Как таковой, он должен быть абсолютно потокобезопасным.
Раздел 12.6 спецификации EJB 3.1 гласит следующее:
Объект InvocationContext предоставляет метаданные, которые позволяют
методы-перехватчики для управления поведением цепочки вызовов.
Контекстные данные не разделяются между отдельными бизнес-методами
вызовы или события обратного вызова жизненного цикла. Если перехватчики вызываются
в результате вызова конечной точки веб-службы карта
getContextData возвращает JAX-WS MessageContext
Кроме того, метод getContextData описан в 4.3.3:
Метод getContextData позволяет бизнес-методу, методу обратного вызова жизненного цикла или методу тайм-аута извлечь любой контекст перехватчика / веб-сервисов, связанный с его вызовом.
С точки зрения фактической реализации, JBoss AS делает следующее:
public Map<String, Object> getContextData() {
return CurrentInvocationContext.get().getContextData();
}
Где CurrentInvocationContext
использует стек, основанный на локально связанном поточном списке , для извлечения и передачи текущего контекста вызова.
См. org.jboss.ejb3.context.CurrentInvocationContext . Контекст вызова просто лениво создает простой HashMap
, как это делается в org.jboss.ejb3.interceptor.InvocationContextImpl
Glassfish делает нечто подобное. Он также получает вызов и делает это из диспетчера вызовов , который также использует стек, основанный на списке локальных потоков , для извлечения и отправки Снова вызвать контексты.
JavaDoc для реализации GlassFish особенно интересен здесь:
Эта переменная TLS хранит ArrayList. ArrayList содержит
ComponentInvocation объекты, которые представляют стек вызовов
в этой теме. Доступ к ArrayList не нужно синхронизировать
потому что каждый поток имеет свой собственный ArrayList.
Как и в JBoss AS, GlassFish слишком лениво создает простой HashMap
, в данном случае в com.sun.ejb.EjbInvocation . В случае GlassFish интересно то, что соединение с веб-сервисом легче обнаружить в источнике.