3

sessionDestroyed()無効化またはタイムアウト時にのみ呼び出され、サーバーの終了時に呼び出されないのはなぜですか? サーバーが終了しているときに、各セッションでいくつかの操作を行うにはどうすればよいですか?

4

3 に答える 3

5

Java Servlet 3.0 仕様では、HttpSessionListener.sessionDestroyed()サーバー/アプリケーションのシャットダウン時に を呼び出す必要があると規定されています (セクション 11.3.4 Notifications At Shutdown )。

アプリケーションのシャットダウン時に、リスナーは宣言とは逆の順序で通知され、コンテキスト リスナーへの通知の前にセッション リスナーへの通知が行われます。コンテキスト リスナーにアプリケーションのシャットダウンが通知される前に、セッション リスナーにセッションの無効化を通知する必要があります。

Tomcat 7 は Java Servlet 3.0 仕様を実装しており、ユース ケースをサポートする必要があります。

于 2012-08-28T18:27:29.440 に答える
2

Glassfish Web Deployment 後の実行コードを読むと、この質問の答えにたどり着きました。

次のように、コンテキストがロードまたは終了されたときにトリガーされるように ServletContextListener をコーディングする機能があります。

public class MyServlet implements ServletContextListener {

  public void contextInitialized(ServletContextEvent e) {
         // implementation code
  }

  public void contextDestroyed(ServletContextEvent e) {
         // implementation code
  }
}

あなたの場合、シャットダウンがトリガーされると、 contextDestroyed() メソッドが呼び出されます。

参照:

ガリス・スエロに感謝

于 2012-08-29T07:24:50.073 に答える
2

最初の質問について:

sessionDestroyed() が無効化またはタイムアウト時にのみ呼び出され、サーバーの終了時に呼び出されないのはなぜですか?

TomcatsessionDestroyed()の投稿 ( http://comments.gmane.org/gmane.comp.jakarta.tomcat.ユーザー/215644

Web アプリケーションをリクエストすると、sessionCreated を受け取ります。コードからセッションを無効にすると、sessionDestroyed を受け取ります。残念ながら、Web アプリケーションを停止すると、sessionDestroyed を受け取りません。

StandardContext が停止しているコードを確認しました。StandardManager.stop が呼び出されていることがわかりますが、これは問題ありませんが、StandardManager.doUnload() が呼び出されると、その実装で * session.expire(false)* が呼び出されます。ここで、「false」は実際には、通知するかどうかを示すフラグです。リスナーかどうか。「false」で呼び出されるため、リスナーは呼び出されません。

これは私の投稿ではなく、投稿者である Violeta の功績によるものです。

投稿は、パッチを適用する方法を提供しますStandardManager.java

そのクラスを変更したくない場合 (個人的には、可能な限り Application Server に属するクラスを変更することは避けています)、別のアプローチを取ることもできます。

2番目の質問について:

サーバーが終了しているときに各セッションでいくつかの操作を行うにはどうすればよいですか?

サーバーが終了しているときに、各セッションで操作を実行する必要があるのはなぜですか? サーブレット仕様は、サーバーのシャットダウン時にコードを実行するためのメソッドを提供します。ただし、アクティブなセッションごとに操作を実行できる手段は提供されません (おそらく設計によるものです)。

この以前の回答で言及されているように、 Java で HTTP セッションにアクセスする方法、セッション管理はサーブレット コンテナーによって処理される必要があり、アプリケーションに対する現在のアプローチを再考することができます。

サーバーがシャットダウンされているときの一般的な処理のクリーンアップについてはServletContextListener.contextDestroyedServlet.destroy

ServletContextListenerインターフェイスはライフサイクル メソッドを提供しcontextDestroyedます

サーブレット インターフェイスは、サーバーがシャットダウンされているときにリソースを解放したり、クリーンアップを処理したりするために使用される destroy メソッドを提供します。

于 2012-08-28T18:05:39.607 に答える