SessionScopedのPreDestroyが呼ばれるタイミング

CDIのSessionScopedアノテーションを付けたBeanのなかに、

@PostConstruct

@PreDestroy

をつけた場合に、PostConstructはちゃんと、セッション生成時に呼ばれるんだけど、PreDestroyがちょっと曲者な感じで、セッション破棄されてから少し経たないと呼ばれない。
(多分だけど、PreDestroyは、finalize メソッド内で呼ばれてて、GCのタイミングに実行されているとか?)

その少しの間に画面上の操作を行うと、セッション切れでエラーになって新しいセッションが生成されるて、そもそもPreDestroyが呼ばれなくなる。

JavaEEのお作法的に、PreDestroy上ではそのSessionScopedBeanの後処理を書きましょう。っていう風に言われているけど、必ず呼ばれる保証がないところにそんな処理は書けないよね。

そんなこんなで、結局セッション破棄時にどうしてもやりたいことは、 HttpSessionListenerを使ったほうがいいのかなと思いました。