2011-12-06 28 views
3

SpringフレームワークのHttpSessionMutexListenerリスナーが今日のアプリケーションサーバー/ Webコンテナでまだ関連しているかどうかを知りたいと思います(2.5+サーブレット仕様サーバーTomcat 6またはTomcat 7)を使用するか、または2.3(またはそれ以前の)サーブレット仕様コンテナのクラスタ化された環境でのみ並行性の問題を解決しますか?SpringのWebUtils.getSessionMutex(javax.servlet.http.HttpSession)とHttpSessionMutexListenerはまだまだ関連しています

答えて

5

あなたは、Springのセッションミューテックスに、それ以上のパワーを与えると思います。これは、単純に、​​ステートメントの式で使用することを目的とした公開名WebUtils.SESSION_MUTEX_ATTRIBUTEで保存されたセッション属性です。私はそれがどのように "クラスタ化された環境でセッションオブジェクトをロックする"ために使用できるのか分かりません。ここではSpringの独自のコードからの使用スニペットです:

HttpSession session = request.getSession(false); 
if (session != null) { 
    Object mutex = WebUtils.getSessionMutex(session); 
    synchronized (mutex) { 
     return handleRequestInternal(request, response); 
    } 
} 

1 JVMでmutexオブジェクトへの参照が別のJVMに使用することはできませんので、そのロックを取得すると、別のJVMで実行されているコードへの影響はありません。しかし、サーブレットの仕様は以下を含んでいます:

配布可能としてマークされたアプリケーション内では、セッションの 一部であるすべての要求は、一度に1つのJVMによって処理されなければなりません。

この要件は少なくとも2.3以降であり、Springのミューテックスが何かをしているかのように動作する可能性があります。実際には、リクエストが1つのJVMで処理されるコンテナです時間。余談として

、これは春のセッションミューテックスを意味し、私は数年前の同時実行・関心に作られたポストのことを思い出す:

仮定:コメントに基づいて

JTaP article on stateful web apps

更新JVM-1とJVM-2はクラスタ内で2つのノードを構成します。また、request-1とrequest-2が同じセッションに参加しているとします。 request-1がJVM-1で処理されている場合、request-1が完了するまでJVM-2でrequest-2を処理することはできません。ただし、request-2 をJVM-1で同時に処理できます。

要求が異なるJVMで処理される場合は、最初の要求(JVM-1)によって発生したセッション変更が2番目の要求(JVM-2)で可視になることを意味します。

+0

「セッションの一部であるすべての要求は、一度に1つのJVMで処理する必要があります」とはどういう意味ですか?コンテナが同じセッションを保証するために使用しなければならないテクニックは、常に同じJVMによって処理されるので、仕様はスティッキセッションを規定していますか?それとも、コンテナが、同じセッションがアクセスされることを(何とか)保証する必要があることを意味しますか? –

関連する問題