Можно ли использовать @WebService, @Stateless и @Singleton в целом в одном компоненте EJB 3?

#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 🙂 Такие аспекты, как параллелизм, важны при их использовании, но это, вероятно, выходит за рамки этого поста.