Главная » Java, JavaBeans » Цикл жизни stateful session-Компонента

0

Цикл жизни такого Компонента обычно состоит из следующих этапов

и событий:

•          В ответ на запрос клиента Контейнер создает новый объект.

•          Экземпляр Компонента готов к выполнению запросов клиента. Такое его состояние называется "method ready state". Бизнес-методы Компонента могут выполняться как в контексте транзакции, так и вне любой транзакции – в зависимости от значения атрибутов в Дескрипторе Поставки и контекста транзакции клиента.

•          Нетранзакционные методы session-Компонента выполняются экземпляром в состоянии "method ready".

•          Экземпляр Компонента становится участником транзакции, когда клиент вызывает его транзакционный метод. Правильную работу с контекстом транзакции обеспечивает Контейнер. Завершение транзакции (подтверждение или откат) выполняется сервисом транзакций.

•          В определенный момент Контейнер может выгрузить экземпляр Компонента из памяти. В этом случае выполняется деактивизация (passivation) Компонента с записью его состояния в хранилище. Session-Компонент не может быть выгружен, если он участвует в транзакции.

•          Если клиент вызывает другой метод выгруженного Компонента, Контейнер снова загружает его в память. При этом происходит восстановление его состояния из хранилища, и Компонент готов выполнить запрос клиента.

•          В ответ на вызов клиентом метода remove(), Контейнер уничтожает экземпляр Компонента. Он может сделать это и при истечении определенного интервала времени (по тайм-ауту).

На рис. 6.1 показан цикл жизни session-Компонента.

Рис. 6.1

Обычно свое существование Компонент начинает в результате вызова клиентом метода create () его home-интерфейса. Реализацию home- интерфейса обеспечивает Контейнер, используя при этом класс Компонента. Контейнер создает новый экземпляр, инициализирует его и возвращает клиенту объектную ссылку. При этом Контейнер вызывает методы setSessionContext () и затем ejbCreate() класса Компонента. Разработчик Компонента может использовать эти методы для выполнения инициализации. В результате экземпляр переходит в состояние "method ready", что означает, что он готов выполнить нетранзакционный метод или присоединиться к транзакции. (Более подробные сведения о методах session-Компонентов находится в разделе "Интерфейс SessionBean" на стр. 6-5. См. раздел "Реализация session-Компонента" на стр. 6-7.)

Когда клиент вызывает метод remove () home- или remote-интерфейса, Контейнер вызывает соответствующий метод ejbRemove() объекта. Это позволяет разработчику Компонента выполнить требуемые действия непосредственно перед его удалением. После завершения вызова, объект переходит в состояние "nonexistent", т.е. "несуществующий". Если клиент попробует обратиться к объекту с таким состоянием, Контейнер возбудит исключительную ситуацию java.rmi.NoSuchObjectException.

Контейнер может деактивизировать экземпляр Компонента. Обычно это делается с целью оптимизации использования ресурсов, например, когда к экземпляру нет обращений в течение долгого времени или Контейнеру потребовалась дополнительная память. Когда происходит деактивизация объекта (ее также называют "passivation"), Контейнер записывает ссылку на объект и его состояние на диск, освобождая память, занимаемую объектом. Контейнер также обязан сохранить ссылки на файлы или другие ресурсы операционной системы, которые используются Компонентом. В процессе выполнения деактивизации Контейнер вызывает метод ejbPassivation (), а при выполнении

активации – е jbActivation (). Как правило, активизация выполняется в ответ на вызов клиентом метода Компонента по ссылке на него, находящейся у клиента. При этом Контейнер заново размещает объект в памяти.

Обратите внимание на то, что на процесс деактивизации влияет значение флага EJB passivation time-out. Если значение этого флага равно 0, то Контейнер никогда не выполняет деактивизацию объекта. Если его значение отлично от 0, то оно рассматривается как величина (в секундах) интервала времени, по истечении которого выполняется деактивизация объекта.

Когда клиент вызывает метод экземпляра Компонента в контексте транзакции, Контейнер либо начинает новую транзакцию, либо включает Компонент в уже существующую. В процессе выполнения транзакции предусмотрены специальные точки, который называются точками синхронизации транзакций (transaction synchronization points), когда экземпляр Компонента может получать сообщения о выполнении тех или иных событий и, соответственно, выполнить некоторый предварительные действия, если это необходимо. Это точки синхронизации определяются интерфейсом SessionSynchronization. (См. раздел "Session-интерфейс синхронизации" на стр. 6-6.) Session- Компонент, который хочет получать уведомление о таких событиях, обязан реализовать интерфейс SessionSynchronization. Реализовывать этот интерфейс не обязательно.

Реализация Контейнера EJB фирмой Inprise расширяет возможности архитектуры EJB в области обеспечения долговременного хранения информации. Обычно время жизни session-Компонента определяется временем жизни его Контейнера. Для большинства EJB-Контейнеров это означает, что после завершения работы Сервера (или JVM), под управлением которого выполнялся Контейнер, теряют смысл все ссылки на его экземпляры Компонентов EJB. Тем не менее, Inprise- Контейнеры позволяют выполнять деактивизацию с сохранением состояния объектов. Если это сделано, то объект может быть восстановлен в другом Контейнере. Такое поведение является предпочтительным, но поддерживается не всеми Контейнерами EJB.

Источник: Руководство программиста Enterprise JavaBeans

По теме:

  • Комментарии