4. Компонент выполняет запрошенный вызов и остается в памяти, ожидая последующих запросов от клиентов.

5. Если клиент ничего не запрашивает в течение некоторого периода времени, то контейнер вызывает метод, аннотированный @PrePassivate, если таковой имеется, и пассивизирует экземпляр компонента в постоянное хранилище.

6. Если клиент вызывает пассивизированный компонент, контейнер помещает его обратно в память и вызывает метод с аннотацией @PostActivate, если таковой имеется.

7. Если клиент не вызывает пассивизированный экземпляр компонента в течение определенного периода времени, то контейнер разрушает его.

8. В качестве замены шагу 7, если клиент вызывает метод, аннотированный @Remove, контейнер вызывает метод с аннотацией @PreDestroy, если таковой имеется, и заканчивает жизненный цикл экземпляра компонента.

Рис. 8.2. Жизненный цикл компонента, сохраняющего состояние

В некоторых случаях компонент, сохраняющий состояние, содержит открытые ресурсы, такие как сетевые сокеты или соединения с базой данных. Поскольку контейнер не может держать эти ресурсы открытыми для каждого компонента, вам придется закрывать и снова открывать ресурсы до и после пассивизации, используя методы обратного вызова. Другая возможность состоит в отключении поведения активизации/пассивизации по умолчанию или компонента, сохраняющего состояние. Вы должны очень осторожно использовать эту особенность, но вы нуждаетесь именно в ней. Можете аннотировать ваши компоненты, сохраняющие состояние, с помощью атрибута @Stateful(passivationCapable = False).

<p>Методы обратного вызова</p>

Как вы только что видели, каждый тип сессионных компонентов имеет свой собственный управляемый контейнером жизненный цикл. Контейнер позволяет вам предоставить бизнес-логику, которая будет использована при смене состояния компонента. Переход из одного состояния в другое может быть перехвачен контейнером для вызова методов, аннотированных одним из способов, показанных в табл. 8.1.

Таблица 8.1. Аннотации методов обратного вызова, предназначенных для работы с жизненным циклом
АннотацияОписание
@PostConstructМетод должен быть вызван сразу после создания экземпляра компонента и выполнения контейнером внедрения зависимостей. В подобных методах часто выполняется инициализация
@PreDestroyМетод должен быть вызван сразу после того, как контейнер уничтожит экземпляр компонента. Этот метод часто используется для
освобождения ранее инициализированных ресурсов. У компонентов, сохраняющих состояние, это происходит, когда истекает время ожидания или когда отработает метод, аннотированный @Remove
@PrePassivateЭтот метод предназначен только для компонентов, сохраняющих состояние. Он должен быть вызван перед тем, как контейнер пассивизирует экземпляр. Обычно это дает компоненту время, чтобы подготовиться к сериализации и освободить ресурсы, которые не могут быть сериализованы (например, закрываются соединения с базой данных, менеджеры сообщений, сетевые сокеты и др.)
@PostActivateЭтот метод предназначен только для компонентов, сохраняющих состояние. Он должен быть вызван
Перейти на страницу:

Похожие книги