EJB запрашивает ссылку на себя? - PullRequest
3 голосов
/ 06 января 2012

Если метод EJB выполняет поиск JNDI для того же EJB и затем выполняет какой-либо другой метод, гарантированно ли это будет выполняться в том же потоке?Как насчет реального экземпляра объекта EJB;это тот же экземпляр, который используется в вызывающем методе?

1 Ответ

3 голосов
/ 07 января 2012

Спецификация EJB не ограничивает возможность внедрения EJB в себя (см. Спецификацию EJB 3.1, глава 16.5.1.1):

Ссылка [@EJB] может относиться кбизнес-интерфейс сессионного компонента или представление без интерфейса сессионного компонента, или локальный домашний интерфейс или удаленный домашний интерфейс сессионного компонента или объектного компонента.

Как и при каждом вызове EJB, он всегда будетвыполняется в том же потоке;основанный на правиле не повторяющихся экземпляров , он не должен быть одним и тем же экземпляром (глава 4.10.13):

[...] Statefulи сессионные компоненты без сохранения состояния не должны кодироваться как входящие.Одним из следствий этого правила является то, что приложение не может выполнять петлевые вызовы для экземпляра сеансового компонента без сохранения состояния или с состоянием.

Это означает: если компонент A вызывает метод для компонента B, а B вызывает любой метод дляA, контейнер должен убедиться, что B вызывает другой экземпляр A;тот факт, что это один и тот же поток, не имеет значения, поскольку повторяемость и безопасность потока - это разные вещи.

Та же самая ситуация применяется, когда A вызывает себя через проверенную ссылку JNDI, так как контейнер задействован во время выполненияв поиске свободного экземпляра A. И наоборот, если A напрямую вызывает один из его методов, это простой вызов метода Java для «this», не включающий контейнер.

...