2

ステートフルセッションBeanを使用して、顧客に飛行機の座席を予約させたとします。クライアントが明示的に私のRemoveメソッドを呼び出すと、彼のすべての予約がキャンセルされ、その後Beanが削除されます。

ただし、クライアントがしばらくアイドル状態でBeanが不動態化された場合、不動態化中にBeanがタイムアウトすると、関数を呼び出さずにBeanが削除されます。ですから、豆が削除された場合に予約がキャンセルされることを確認する方法を誰かに教えてもらえれば幸いです。@PreDestroyアノテーションを使用すると、この問題は解決しますか?

よろしく、ジェームス・トラン

4

3 に答える 3

4

@PreDestroyメソッドが呼び出されない可能性は十分にあります。EJB 3.1仕様では、次のように明示的に規定されています。

4.6.3見落とされたPreDestroy呼び出し

Beanプロバイダーは、コンテナーがセッションBeanインスタンスのPreDestroyライフサイクルコールバックインターセプターメソッド(またはejbRemoveメソッド)を常に呼び出すと想定することはできません。次のシナリオでは、PreDestroyライフサイクルコールバックインターセプターメソッドがインスタンスに対して呼び出されません。

•EJBコンテナのクラッシュ。

•インスタンスのメソッドからコンテナにスローされたシステム例外。

インスタンスがパッシブ状態にある間のクライアントの非アクティブのタイムアウト。タイムアウトは、EJBコンテナ実装固有の方法でDeployerによって指定されます。

@PreDestroyこの仕様では、このようなシナリオでメソッドが呼び出されない場合にリソースを削除する方法についても詳しく説明しています。

たとえば、ショッピングカートコンポーネントがセッションBeanとして実装され、セッションBeanがショッピングカートのコンテンツをデータベースに格納する場合、アプリケーションは定期的に実行され、データベースから「放棄された」ショッピングカートを削除するプログラムを提供する必要があります。

あなたの場合、それはあなたがあなたの予約の状態をどのように保存しているかに依存するでしょう。それらがデータベースに保持されている場合は、仕様で義務付けられているのと同じアプローチを採用することをお勧めします。EJBタイマーサービスを使用して、このアクティビティを定期的に実行するか、Quartzなどのスケジューラーを使用できます。存在しなくなったパッシベーションされたセッションBeanインスタンスの内容と、再度準備されるインスタンスの内容を区別することが不可欠であることに注意してください。

于 2011-07-18T09:07:57.713 に答える
1

不動態化されたBeanはタイムアウト時に破棄されるため、注釈が付けられたメソッドはすべて、@PreDestroy探していることを実行します。

Aがアクティブである間、ステートフルBeanのAのインスタンスは、Aのインスタンスが破棄されるまでBと共有されません。詳細については、この記事の図を参照してください

于 2011-07-18T09:02:58.583 に答える
0

はい、そうすべきです。注釈が付けられたメソッドは@PreDestroy、Beanを削除する前に呼び出されます(不動態化された状態でタイムアウトした場合でも)

于 2011-07-18T09:01:12.353 に答える