#java #annotations #java-ee-6 #ejb-3.1
#java #аннотации #java-ee-6 #ejb-3.1
Вопрос:
Я использую EJB 3 и JBoss КАК 6.0.0.Final. У меня есть сеансовый компонент без состояния с аннотациями @Stateless
и @WebService
. Когда я добавляю аннотацию @Singleton
, при развертывании отображается сообщение об ошибке:
…name=ServiceBean, service=ejb3 уже установлен
Что я могу сделать, чтобы избежать ошибки развертывания?
Ответ №1:
Вы можете использовать @WebService и @Stateless или @WebService и @Singleton в одном компоненте, что имеет смысл, если вы хотите предоставить POJO как веб-сервис, так и EJB.
Не вижу особого смысла в использовании @Stateless и @Singleton в одном компоненте. Когда вы используете @Singleton, вы создаете EJB со всеми возможностями EJB (управление транзакциями, безопасность и т. Д.) Точно так же, Как с @Stateless . Единственное отличие заключается в том, как контейнер управляет жизненным циклом EJB:
- @Stateless: экземпляр EJB создается сразу после первого запроса, и когда запрос заканчивается, EJB объединяется в пул и готов к повторному использованию, если поступит другой запрос. Однако, если все объединенные экземпляры используются в момент поступления другого запроса для того же компонента, контейнер создает новый экземпляр того же самого для обслуживания этого нового запроса.
- @Singleton: экземпляр EJB создается после поступления первого запроса (по умолчанию — см. @Startup, чтобы переопределить это поведение), и это будет единственный экземпляр, созданный контейнером. Если другой запрос хочет использовать тот же EJB, контейнер никогда не создаст его новый экземпляр — будет использоваться ранее созданный экземпляр. Это похоже на @Stateless EJB с размером пула 1 🙂 Такие аспекты, как параллелизм, важны при их использовании, но это, вероятно, выходит за рамки этого поста.