Вполне возможно, что метод @PreDestroy
не будет вызван. Спецификация EJB 3.1 прямо заявляет это:
4.6.3 Пропущенные вызовы PreDestroy
Поставщик бинов не может предполагать, что контейнер всегда будет вызывать
метод (ы) перехватчика обратного вызова жизненного цикла PreDestroy (или ejbRemove)
метод) для экземпляра сессионного компонента. Следующие сценарии приводят к
методы перехватчика обратного вызова жизненного цикла PreDestroy не
вызывается для экземпляра:
• Сбой контейнера EJB.
• Системное исключение, выброшенное из метода экземпляра в контейнер.
• Тайм-аут бездействия клиента, когда экземпляр находится в пассивном состоянии. Тайм-аут указывается Deployer в зависимости от реализации контейнера EJB.
Спецификация также подробно описывает, как ресурсы могут быть удалены, если метод @PreDestroy
не вызывается в таких сценариях:
Например, если компонент корзины покупок реализован как сеанс
bean-компонент, а сессионный компонент сохраняет содержимое корзины покупок в
база данных, приложение должно предоставить программу, которая работает
периодически удаляет «оставленные» корзины покупок из базы данных.
В вашем случае это будет зависеть от того, как вы храните состояние ваших бронирований. Если они сохраняются в базе данных, я бы предложил использовать тот же подход, который указан в спецификации. Вы можете использовать службу EJB Timer, чтобы периодически выполнять это действие, или использовать планировщик, такой как Quartz. Обратите внимание, что крайне важно различать содержимое пассивных экземпляров сессионных компонентов, которых больше не существует, и тех, которые будут снова готовы.