SessionScopedのPreDestroyが呼ばれるタイミング
CDIのSessionScopedアノテーションを付けたBeanのなかに、
@PostConstruct
@PreDestroy
をつけた場合に、PostConstructはちゃんと、セッション生成時に呼ばれるんだけど、PreDestroyがちょっと曲者な感じで、セッション破棄されてから少し経たないと呼ばれない。
(多分だけど、PreDestroyは、finalize メソッド内で呼ばれてて、GCのタイミングに実行されているとか?)
その少しの間に画面上の操作を行うと、セッション切れでエラーになって新しいセッションが生成されるて、そもそもPreDestroyが呼ばれなくなる。
JavaEEのお作法的に、PreDestroy上ではそのSessionScopedBeanの後処理を書きましょう。っていう風に言われているけど、必ず呼ばれる保証がないところにそんな処理は書けないよね。
そんなこんなで、結局セッション破棄時にどうしてもやりたいことは、 HttpSessionListenerを使ったほうがいいのかなと思いました。