これは、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)のライフサイクルを追跡できる他の方法はありますか。ありがとう!