私は人々が共同作業できるWebアプリケーションを作成しています。個々のhttpセッションではなく、いくつかの人が関わっているコラボレーションに範囲を絞ってサービスを提供したいと考えています。私は豆を保管するカスタムScope
を作成しました。豆のライフサイクルを管理するために、私は次のように関連付けられたセッションIDを追跡:HttpSessionListenerでスコープを接続する
protected ConcurrentMap<String,Object> attributes =
new ConcurrentHashMap<String, Object>();
...
@Override
public Object get(String name, ObjectFactory<?> factory) {
synchronized(this.attributes) {
Object scopedObject = this.attributes.get(name);
if (scopedObject == null) {
scopedObject = factory.getObject();
this.attributes.put(name, scopedObject);
RequestAttributes reqAttrs = RequestContextHolder.currentRequestAttributes();
activeSession(name).add(reqAttrs.getSessionId());
}
return scopedObject;
}
}
セッションを閉じると、私は与えられたBean名に関連付けられたアクティブなセッションのリストからセッションIDを削除したいと思います。セットが空になると、私はきれいにすることができます。
私が管理セッションのクローズを考えると最も簡単な方法はHttpSessionListener
ですが、私はScope
とリスナーの間を切断しています。
私は、静的
HttpSessionListener
を作成する唯一のインスタンスを想定し、それはサブスクリプションのリストを管理していて、私のScope
インスタンスがそのイベントにサブスクライブすることができ:私は、次の可能性を参照してください。しかし、それは重複しているように見えますが、私はこのためのシングルトンのパターンが嫌いです。私はScope
にHttpSession
へのアクセスを持っていた場合、私はセッションに格納されたリストに
Scope
を追加し、リスナーがセッションを離れて起こっているそのリストのメンバーに通知する可能性があります。しかし、私はどのようにScope
インスタンスのセッションオブジェクト(そのIDだけではなく)に手を差し伸べるか分かりません。私は
Scope
にHttpSessionListener
インターフェイスを実装して、その状態を直接更新することができますが、プログラムでリスナーを登録する方法はわかりません。それを行う公的な方法はありますか?もっと良い方法がありますか?
次のようにご協力いただきありがとうございますが、
遺伝子
[Springy]解決策がある[関連する質問](http://stackoverflow.com/questions/2433321/how-to-inject-dependencies-into-httpsessionlistener-using-spring)があります。 – Eyal