Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Разработка встраиваемых приложений Enterprise-бинов

Все встраиваемые контейнеры EJB поддерживают функции, перечисленные в табл. 38-1.

Таблица 38-1. Необходимые функции Enterprise-бина во встраиваемом контейнере

Функция Enterprise-бина

Описание

Локальные сессионные бины

Локальное и неинтерфейсное представление компонентов без сохранения состояния, с сохранением состояния и синглтон. Доступ ко всем методам синхронный. Сессионные компоненты не должны быть конечными точками веб-сервиса.

Транзакции

Управляемые контейнером и компонентом транзакции.

Безопасность

Декларативная и программная безопасность.

Interceptor-ы

Interceptor-ы уровня класса и уровня метода для сессионных компонентов.

Дескриптор развёртывания

Необязательный дескриптор развёртывания ejb-jar.xml с теми же правилами переопределения для контейнера Enterprise-бинов на серверах Java EE.

Поставщикам контейнеров разрешено поддерживать полный набор функций в Enterprise-бинах, но приложения, использующие встроенный контейнер, не будут переносимыми, если они используют функции Enterprise-бинов, не перечисленные в таблице 38-1, такие как сервис таймера, сессионные компоненты в качестве конечных точек веб-сервиса или удалённые бизнес-интерфейсы.

Запуск встроенных приложений

Встроенный контейнер, компоненты Enterprise-бина и клиент выполняются в одной виртуальной машине с использованием одного и того же classpath. В результате разработчики могут запустить приложение, которое использует встроенный контейнер, как обычное приложение Java SE, следующим образом:

java -classpath mySessionBean.jar:containerProviderRuntime.jar:myClient.jar \
com.example.ejb.client.Main

В приведённом выше примере mySessionBean.jar — это файл EJB JAR, содержащий локальный сессионный компонент без сохранения состояния containerProviderRuntime.jar — JAR-файл Enterprise-бина, который содержит необходимый классы времени выполнения для встроенного контейнера, а myClient.jar — это JAR-файл, содержащий приложение Java SE, которое вызывает бизнес-методы в сессионном компоненте через встроенный контейнер.

Исполняемый JAR-файл GlassFish Server glassfish-embedded-all.jar включает классы для встроенного контейнера.

Создание контейнера Enterprise-бинов

Абстрактный класс javax.ejb.embedded.EJBContainer представляет объект контейнера Enterprise-бина и включает фабричные методы для создания объекта контейнера. Метод EJBContainer.createEJBContainer используется для создания и инициализации объекта встроенного контейнера.

В следующем фрагменте кода показано, как создать встроенный контейнер, который инициализируется с настройками по умолчанию поставщика контейнера:

EJBContainer ec = EJBContainer.createEJBContainer();

По умолчанию встроенный контейнер будет искать classpath виртуальных машин для модулей Enterprise-бинов: каталоги, содержащие дескриптор развёртывания META-INF/ejb-jar.xml, каталоги, содержащие файл классов с Enterprise-бинов с аннотациями компонентов (такими как @Stateless) или файлы JAR, содержащие дескриптор развёртывания ejb-jar.xml или файл класса с аннотацией Enterprise-бина. Любые совпадающие записи считаются модулями EJB в одном и том же приложении. Как только все допустимые модули Enterprise-бинов будут найдены в classpath, контейнер начнет инициализацию модулей. Когда метод createEJBContainer успешно возвращается, клиентское приложение может получить ссылки на представление клиента любого модуля EJB, найденного встроенным контейнером.

Альтернативная версия метода EJBContainer.createEJBContainer принимает Map свойств и настроек для настройки объекта встраиваемого контейнера:

Properties props = new Properties();
props.setProperty(...);
...
EJBContainer ec = EJBContainer.createEJBContainer(props);

Явное указание модулей Enterprise-бина для инициализации

Разработчики могут точно указать, какие модули Enterprise-бина будут инициализированы встроенным контейнером. Чтобы явно указать модули Enterprise-бина, инициализированные встроенным контейнером, установите свойство EJBContainer.MODULES.

Модули могут находиться либо в classpath виртуальных машин, в котором выполняются встроенный контейнер и клиентский код, либо вне classpath виртуальных машин.

Чтобы указать модули в classpath виртуальных машин, задайте для EJBContainer.MODULES значение String, чтобы указать одно имя модуля, или массив String, содержащий имена модулей. Встроенный контейнер ищет classpath виртуальной машины для модулей Enterprise-бина, соответствующих указанным именам:

Properties props = new Properties();
props.setProperty(EJBContainer.MODULES, "mySessionBean");
EJBContainer ec = EJBContainer.createEJBContainer(props);

Чтобы указать модули Enterprise-бина вне classpath виртуальной машины, задайте для EJBContainer.MODULES объект java.io.File или массив объектов File , Каждый объект File ссылается на файл EJB JAR или каталог, содержащий расширенный файл EJB JAR:

Properties props = new Properties();
File ejbJarFile = new File(...);
props.setProperty(EJBContainer.MODULES, ejbJarFile);
EJBContainer ec = EJBContainer.createEJBContainer(props);

Поиск ссылок на сессионный компонент

Чтобы получить ссылки на сессионные компоненты в приложении, используя встроенный контейнер:

  1. Используйте объект EJBContainer, чтобы получить объект javax.naming.Context.

  2. Вызовите метод EJBContainer.getContext, чтобы получить объект Context:

    EJBContainer ec = EJBContainer.createEJBContainer();
    Context ctx = ec.getContext();

    Ссылки на сессионные компоненты могут быть получены с использованием переносимого синтаксиса JNDI, подробно описанного в Переносимый синтаксис JNDI. Например, чтобы получить ссылку на MySessionBean, локальный сессионный компонент с представлением без интерфейса, используйте следующий код:

    MySessionBean msb = (MySessionBean)
                ctx.lookup("java:global/mySessionBean/MySessionBean");

Завершение работы контейнера с Enterprise-бинами

Чтобы закрыть встроенный контейнер:

  1. Из клиента вызовите метод close объекта EJBContainer.

    EJBContainer ec = EJBContainer.createEJBContainer();
    ...
    ec.close();

    Хотя клиентам не требуется закрывать объекты EJBContainer, это освобождает ресурсы, занятые встроенным контейнером. Это особенно важно, когда виртуальная машина, на которой запущено клиентское приложение, превышает время жизни клиентского приложения.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)