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
, это освобождает ресурсы, занятые встроенным контейнером. Это особенно важно, когда виртуальная машина, на которой запущено клиентское приложение, превышает время жизни клиентского приложения.
Назад | Вперёд | Содержание |