EJB3, как сделать так, чтобы бин был удален - PullRequest
2 голосов
/ 18 июля 2011

Предположим, я позволил своему клиенту зарезервировать места в самолете, используя Stateful Session Bean Если клиент явно вызывает мой метод Remove, все его резервирования будут отменены, а компонент будет удален позже.

Однако, если клиент некоторое время простаивает и Бин пассивируется, если Бин истекает при пассивации, он будет удален без вызова какой-либо из моих функций. Следовательно, я был бы очень признателен, если бы кто-нибудь показал мне, как я могу убедиться, что резервирование будет отменено, если бин будет удален. Если я использую аннотацию @PreDestroy, решит ли она эту проблему?

С уважением, Джеймс Тран

Ответы [ 3 ]

4 голосов
/ 18 июля 2011

Вполне возможно, что метод @PreDestroy не будет вызван. Спецификация EJB 3.1 прямо заявляет это:

4.6.3 Пропущенные вызовы PreDestroy

Поставщик бинов не может предполагать, что контейнер всегда будет вызывать метод (ы) перехватчика обратного вызова жизненного цикла PreDestroy (или ejbRemove) метод) для экземпляра сессионного компонента. Следующие сценарии приводят к методы перехватчика обратного вызова жизненного цикла PreDestroy не вызывается для экземпляра:

• Сбой контейнера EJB.

• Системное исключение, выброшенное из метода экземпляра в контейнер.

Тайм-аут бездействия клиента, когда экземпляр находится в пассивном состоянии. Тайм-аут указывается Deployer в зависимости от реализации контейнера EJB.

Спецификация также подробно описывает, как ресурсы могут быть удалены, если метод @PreDestroy не вызывается в таких сценариях:

Например, если компонент корзины покупок реализован как сеанс bean-компонент, а сессионный компонент сохраняет содержимое корзины покупок в база данных, приложение должно предоставить программу, которая работает периодически удаляет «оставленные» корзины покупок из базы данных.

В вашем случае это будет зависеть от того, как вы храните состояние ваших бронирований. Если они сохраняются в базе данных, я бы предложил использовать тот же подход, который указан в спецификации. Вы можете использовать службу EJB Timer, чтобы периодически выполнять это действие, или использовать планировщик, такой как Quartz. Обратите внимание, что крайне важно различать содержимое пассивных экземпляров сессионных компонентов, которых больше не существует, и тех, которые будут снова готовы.

1 голос
/ 18 июля 2011

Пассивированный bean-компонент будет уничтожен по тайм-ауту, и, следовательно, любой метод, отмеченный @PreDestroy, будет делать то, что вы ищете.

Пока A активен, экземпляр A объекта Stateful bean не будет использоваться совместно сB, пока экземпляр А не будет уничтожен.См. диаграмму этой статьи для дальнейшего чтения

0 голосов
/ 18 июля 2011

Да, это должно. Метод, помеченный @PreDestroy, будет вызван до удаления компонента (даже если время ожидания i в пассивированном состоянии)

...