java -classpath mySessionBean.jar:containerProviderRuntime.jar:myClient.jar \
com.example.ejb.client.Main
|
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
| Назад | Вперёд | Содержание |
Все встраиваемые контейнеры EJB поддерживают функции, перечисленные в табл. 38-1.
Таблица 38-1. Необходимые функции Enterprise-бина во встраиваемом контейнере
Функция Enterprise-бина |
Описание |
Локальные сессионные бины |
Локальное и неинтерфейсное представление компонентов без сохранения состояния, с сохранением состояния и синглтон. Доступ ко всем методам синхронный. Сессионные компоненты не должны быть конечными точками веб-сервиса. |
Транзакции |
Управляемые контейнером и компонентом транзакции. |
Безопасность |
Декларативная и программная безопасность. |
Interceptor-ы |
Interceptor-ы уровня класса и уровня метода для сессионных компонентов. |
Дескриптор развёртывания |
Необязательный дескриптор развёртывания |
Поставщикам контейнеров разрешено поддерживать полный набор функций в 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 включает классы для встроенного контейнера.
Абстрактный класс 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-бина, инициализированные встроенным контейнером, установите свойство 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);
Чтобы получить ссылки на сессионные компоненты в приложении, используя встроенный контейнер:
Используйте объект EJBContainer, чтобы получить объект javax.naming.Context.
Вызовите метод EJBContainer.getContext, чтобы получить объект Context:
EJBContainer ec = EJBContainer.createEJBContainer();
Context ctx = ec.getContext();
Ссылки на сессионные компоненты могут быть получены с использованием переносимого синтаксиса JNDI, подробно описанного в Переносимый синтаксис JNDI. Например, чтобы получить ссылку на MySessionBean, локальный сессионный компонент с представлением без интерфейса, используйте следующий код:
MySessionBean msb = (MySessionBean)
ctx.lookup("java:global/mySessionBean/MySessionBean");
Чтобы закрыть встроенный контейнер:
Из клиента вызовите метод close объекта EJBContainer.
EJBContainer ec = EJBContainer.createEJBContainer();
...
ec.close();
Хотя клиентам не требуется закрывать объекты EJBContainer, это освобождает ресурсы, занятые встроенным контейнером. Это особенно важно, когда виртуальная машина, на которой запущено клиентское приложение, превышает время жизни клиентского приложения.
| Назад | Вперёд | Содержание |
Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены.
Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)