7

これは、WAS8.0で実行されているJSF2アプリです。これが1ページの「バッキング」Beanのコードです。

    @Named("mySessionBean")
    @SessionScoped
    @Stateful
    @LocalBean
    @StatefulTimeout(unit = TimeUnit.MINUTES, value = 10)
    public class MySessionBean implements Serializable {
        @PostConstruct
        public void init()
        {
             System.out.println("start MySessionBean: " + this.hashCode());
         }

        @PreDestroy
        public void cleanup()
        {
             System.out.println("destroy MySessionBean: " + this.hashCode());
         }
        ....
    }

web.xmlで設定されたセッションタイムアウト値は、Beanのタイムアウトよりも小さくなっています。アプリを実行すると、@ PostConstructからのプリントアウトが表示されますが、@PreDestroyからのプリントアウトは表示されません。次の2つのシナリオを試しました。1。ログアウト-invalidateSession; 2.セッションが期限切れになるまで待つだけです。

私はアプリのデザイナーではありません。設計者は、すべてのバッキングBeanをステートフルセッションBeanとして作成することを主張しています。より主流のアプローチは、それらをCDIBeanにすることだと思います。とにかく、アノテーションをCDIのみに変更すると、@PreDestroyからもプリントアウトを取得し始めます

    @Named("mySessionBean")
    @SessionScoped
    public class MySessionBean implements Serializable {
    .....

私の質問は、最初のケースで@PreDestroyメソッド呼び出しを受け取らない理由は何ですか?@PreDestroyが呼び出されない場合、「バッキング」Bean(この場合はステートフルセッションBean)のライフサイクルを追跡できる他の方法はありますか。ありがとう!

4

2 に答える 2

4

Java EE 6チュートリアルのこのセクションを見てください。これは、ステートフルセッションBeanのライフサイクルを示しています。PreDestroyメソッドは、Beanがクライアントコードから明示的に削除された場合にのみ呼び出され、@Removeで注​​釈が付けられたメソッドを呼び出します

于 2013-02-07T07:26:24.100 に答える