2016-02-09 2 views
0

Мне интересно узнать объем экземпляра класса, который помечен аннотацией javax.ejb.Singleton.Какова область действия класса, оформленного аннотацией JavaEE Singleton?

Я работаю над веб-приложением, которое состоит из 6 отдельных приложений REST. Эти 6 приложений скомпилированы для войн и все они развернуты внутри одного и того же веб-сервера TomEE.

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

В любом случае, теперь, когда я использую Singleton, у меня есть сомнения в его объеме.

Является ли область экземпляра Singleton ограниченным внутри каждого webapp (один из развернутых webapps не сможет увидеть тот же Singleton, что и другой webapp в пределах одного и того же TomEE), или же веб-сервер каким-то образом разделяет Singleton среди всех развернутые webapps?

+0

Не являются ли глобальные возможности Singletons в веб-приложении? Это одна из причин, почему они плохая идея. Нет совместного доступа через веб-приложения. – duffymo

ответ

2

Чтобы ответить на ваш вопрос, @Singleton EJBs строго ограничены в соответствующем приложении; они могут также быть на двух разных экземплярах сервера. Если у вас есть воспроизводимый тестовый пример, чтобы доказать обратное на вашем любимом контейнере EE - в этом случае TomEE - его разработчики будут благодарны вам за сообщение об ошибке. И, вероятно, будет относиться к нему с высоким приоритетом.

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

+0

Привет. Спасибо за Ваш ответ. Хорошо быть уверенным, что область Singleton - это конкретное приложение. Я не говорил, что у меня есть случай, когда Singleton имеет область действия вне приложения, я говорю, что область ApplicationScoped, казалось, не включает фильтр сервлета, но область действия Singleton делает. По этой причине я был вынужден использовать Синглтон. Что касается вопроса о том, правильно ли или нет, чтобы поделиться областью между фильтром и остальной частью приложения, я думаю, что это имеет смысл, потому что фильтр действительно является частью приложения. – user3441604

+0

Основываясь на том, что кто-то сказал, я понимаю, что основное различие между ApplicationScoped и Singleton связано с проблемами транзакций и параллелизма. Если вы можете предложить другой подход, позволяющий фильтру делиться информацией с остальной частью приложения, пожалуйста, дайте мне знать! благодаря! – user3441604

+0

'@ ApplicationScoped' CDI beans имеют ту же область действия, что и EJB' @ Singletons', однако в настоящее время они не обладают определенными функциями, которые могут оказаться полезными для обладателей синглов EJB. Например, управляемая контейнером блокировка, порядок запуска и т. Д. Оба могут использоваться из фильтра сервлета, вам просто нужно вставить их в него с помощью @EJB и @Inject соответственно. – NBW

Смежные вопросы