EE 6 (GlassFish): сколько контейнеров? Сколько синглетонов? - PullRequest
5 голосов
/ 20 сентября 2010

Хорошо, все еще пытаюсь понять основные концепции EE 6 здесь. Я надеюсь, что кто-то здесь может помочь мне.

Я использую сервер GlassFish v3 Kukla с одним доменом. Я развертываю MyEEApp.ear, который содержит MyEEWebApp.war, MyEJBs.jar и MyUtilityLibrary.jar. Моя банка EJB содержит бин @Singleton MySingleton.

Затем я настроил другой сервер с именем Fran и развернул тот же EAR. Я делаю то же самое для третьего сервера под названием Ollie.

Три идентичных файла EAR развернуты на трех одинаковых (кроме имен и IP-адресов) серверах.

Итак, вот мои вопросы:

  1. На данном сервере, скажем, Кукла, сколько у меня "контейнеров"? Есть ли только один контейнер для EAR? Или у WAR и EJB jar тоже есть свои контейнеры?
  2. Каковы практические последствия первого ответа?
  3. Кстати, что именно является контейнером?
  4. Могут ли классы в моей WAR использовать инъекцию @EJB для доступа к bean-компонентам в EJB-банке, поскольку они оба являются частью одного EAR?
  5. В связи с этим, могут ли простые старые классы Java использовать инъекцию @EJB или это работает только для других EJB?
  6. Сколько экземпляров одиночного бина я создам? Один на сервер? Или только один итог? Если по одному на сервер, есть ли способ гарантировать «истинный» синглтон для всего кластера?
  7. Где и как в GlassFish настроить JNDI для поиска ресурсов? Могу ли я, скажем, переместить EJB-банку с одного компьютера на другой, и веб-приложения найдут его автоматически?
  8. Можно ли настроить распределение нагрузки для EJB-компонентов? Если да, то как?
  9. А как насчет трех экземпляров WAR? Есть ли способ настроить распределение нагрузки, чтобы запросы отправлялись в экземпляр, скажем, на наименее загруженную машину?

Я знаю, много вопросов. Извините за это!

Ваша помощь будет высоко ценится! Джефф

1 Ответ

17 голосов
/ 22 сентября 2010

На данном сервере, скажем, Кукла, сколько у меня "контейнеров"? Есть ли только один контейнер для EAR? Или у WAR и EJB jar тоже есть свои контейнеры?

Термин «контейнер» может быть как-то размытым, но я бы сказал так: полноценный сервер приложений Java EE, такой как GlassFish, предоставляет как веб-контейнер, так и EJB-контейнер. При развертывании EAR WAR (s) будет развертываться и управляться веб-контейнером, а EJB (s) будет развертываться и управляться EJB-контейнером. Это показано на рисунке ниже (из Учебное пособие по Java EE ):

alt text

И как-то - и мне уже жаль, если я что-то путаю - EAR также является своего рода (логическим) контейнером, поскольку сервер Java EE будет обеспечивать четко определенную изолированную иерархию загрузчика классов для каждого EAR и модули Java EE внутри EAR. Проверить Загрузка классов в приложениях Java EE из Упаковка приложений EJB 3 для приятного знакомства с загрузкой классов.

Каковы практические последствия первого ответа?

Вопрос неопределенный, но ... вот несколько примеров:

  • данный экземпляр Application Server может запускать только подмножество служб (например, веб-контейнер или EJB-контейнер)
  • Вы можете развернуть отдельные модули EAR в разных экземплярах кластера (WAR для узлов 1, 2 и EJB-JAR для узлов 3, 4, 5, 6)

Кстати, что такое контейнер?

Используя мои слова, что-то, обеспечивающее среду выполнения и службы для развернутых на нем компонентов. Tomcat - это (Web) контейнер, OpenEJB - это (EJB) контейнер, Spring - это (IoC) контейнер.

Чтобы получить более формальное определение "Java EE", обратитесь к разделу Java EE Containers Учебного руководства по Java EE.

Могут ли классы в моей WAR использовать инъекцию @EJB для доступа к bean-компонентам в EJB-банке, поскольку они оба являются частью одного EAR?

Да, могут.

В таком случае, могут ли простые старые классы Java использовать инъекцию @EJB или это работает только для других EJB?

До Java EE 6 только управляемые компоненты , такие как EJB, сервлеты, фильтры, управляемые bean-компоненты JSF, могли бы извлечь выгоду из внедрения. Но в Java EE 6 теперь можно превратить любой класс в управляемый компонент с использованием CDI ( Java C ontexts и D ependency I njection ). И в этом случае вы можете сделать:

@Inject MyEJB service

Но ваши POJO должны быть компонентами, управляемыми CDI.

Сколько экземпляров одиночного бина я создам? Один на сервер? Или только один итог? Если по одному на сервер, есть ли способ гарантировать «истинный» синглтон для всего кластера?

Спецификация не поддерживает кластеризацию, но IMHO очень вероятно, что большинство поставщиков сделает синглтоны безопасными для кластеров, как Stateful Session Beans (или вы не будете в состоянии поделиться государством и это сделало бы их не очень полезными). Но нет строгого ответа.

И помните, что на рынке еще нет контейнеров с поддержкой кластеров Java EE 6 (ну, у GlassFish 3.1 есть Базовая поддержка кластеризации и управление версиями приложений , начиная с Milestone 1 , но GF 3.1 еще не окончательный, окончательный выпуск запланирован на конец года ).

Где и как в GlassFish настроить JNDI для поиска ресурсов? Можно ли, скажем, переместить EJB-банку с одного компьютера на другой, и веб-приложения найдут его автоматически?

Либо передайте параметры среды, используя непустой конструктор при создании InitialContext или предоставив jndi.properties. GlassFish поставляется по умолчанию (в jndi-properties.jar), при необходимости добавьте свой в свое приложение.

Можно ли настроить балансировку нагрузки для EJB-компонентов? Если да, то как?

Балансировка нагрузки обрабатывается клиентской заглушкой EJB, полученной для кластерного EJB, и чаще всего используется стратегия по умолчанию Round Robin Load Balancing . Другие типичные стратегии включают Балансировка нагрузки на основе веса , Балансировка нагрузки в произвольном порядке (и, возможно, другие). Но я понятия не имею о стратегиях, которые GlassFish будет поддерживать.

И, как уже было написано ранее, пока вы не начнете играть с версиями GlassFish 3.1 от Milestone, кластерная поддержка пока не поддерживается.

А как насчет трех экземпляров WAR? Есть ли способ настроить распределение нагрузки, чтобы запросы отправлялись в экземпляр, скажем, на наименее загруженную машину?

Я бы сказал, что все зависит от балансировщика нагрузки (это может быть аппаратное, программное обеспечение). Я просто скажу несколько слов о распространенном подходе Apache mod_jk. Насколько мне известно, Apache mod_jk может распределять работу одним из трех способов:

  • B (занятость): выберите работника с наименьшим количеством запросов, выполняемых в данный момент
  • R (запросы): выберите работника, который обработал наименьшее количество запросов в целом
  • T (трафик): выберите работника, который передал наименьшее количество байтов

(некоторые) Ресурсы

...