@PreDestroy
メソッドが呼び出されない可能性は十分にあります。EJB 3.1仕様では、次のように明示的に規定されています。
4.6.3見落とされたPreDestroy呼び出し
Beanプロバイダーは、コンテナーがセッションBeanインスタンスのPreDestroyライフサイクルコールバックインターセプターメソッド(またはejbRemoveメソッド)を常に呼び出すと想定することはできません。次のシナリオでは、PreDestroyライフサイクルコールバックインターセプターメソッドがインスタンスに対して呼び出されません。
•EJBコンテナのクラッシュ。
•インスタンスのメソッドからコンテナにスローされたシステム例外。
•インスタンスがパッシブ状態にある間のクライアントの非アクティブのタイムアウト。タイムアウトは、EJBコンテナ実装固有の方法でDeployerによって指定されます。
@PreDestroy
この仕様では、このようなシナリオでメソッドが呼び出されない場合にリソースを削除する方法についても詳しく説明しています。
たとえば、ショッピングカートコンポーネントがセッションBeanとして実装され、セッションBeanがショッピングカートのコンテンツをデータベースに格納する場合、アプリケーションは定期的に実行され、データベースから「放棄された」ショッピングカートを削除するプログラムを提供する必要があります。
あなたの場合、それはあなたがあなたの予約の状態をどのように保存しているかに依存するでしょう。それらがデータベースに保持されている場合は、仕様で義務付けられているのと同じアプローチを採用することをお勧めします。EJBタイマーサービスを使用して、このアクティビティを定期的に実行するか、Quartzなどのスケジューラーを使用できます。存在しなくなったパッシベーションされたセッションBeanインスタンスの内容と、再度準備されるインスタンスの内容を区別することが不可欠であることに注意してください。