На данном сервере, скажем, Кукла, сколько у меня "контейнеров"? Есть ли только один контейнер для EAR? Или у WAR и EJB jar тоже есть свои контейнеры?
Термин «контейнер» может быть как-то размытым, но я бы сказал так: полноценный сервер приложений Java EE, такой как GlassFish, предоставляет как веб-контейнер, так и EJB-контейнер. При развертывании EAR WAR (s) будет развертываться и управляться веб-контейнером, а EJB (s) будет развертываться и управляться EJB-контейнером. Это показано на рисунке ниже (из Учебное пособие по Java EE ):
И как-то - и мне уже жаль, если я что-то путаю - 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 (трафик): выберите работника, который передал наименьшее количество байтов
(некоторые) Ресурсы