6

私たちは商用製品 (このコンテキストでは重要ではない製品) のライセンスを取得しましたが、これは同時ユーザー数によって制限されています。ユーザーは、Spring Controller を介してこの製品にアクセスします。

この製品には N 個のライセンスがあり、N+1 人のユーザーがアクセスすると、さらにライセンスを購入する必要があるという厄介なエラー メッセージが表示されます。ユーザーにこのメッセージが表示されないようにしたいので、N+1 ユーザーが実際にアクセスするよりも、製品への要求を単純に「キューに入れる」ことを希望します。もちろん、彼らは私がライセンスを購入することを好むので、彼らのツールではこれをネイティブに行うことはできません。

ツールを制御できるようにする代わりに、コントローラーへの同時セッションの数を N を超えないように制限したいと思います。他の人は待つことができます。

Spring MVC を使用しています。

何か案は?

4

3 に答える 3

7

必要なのは ObjectPool です。Apache Commons Pool http://commons.apache.org/poolをチェックしてください

アプリケーションの起動時に、商用ライブラリのライセンスまたはオブジェクトを使用してオブジェクト プールを作成する必要があります (どの種類のパブリック インターフェイスがあるかはわかりません)。

public class CommercialObjectFactory extends BasePoolableObjectFactory { 
    // for makeObject we'll simply return a new commercial object
    @Override
    public Object makeObject() { 
        return new CommercialObject(); 
    } 
}

GenericObjectPool pool = new GenericObjectPool(new CommercialObjectFactory());

// The size of pool in our case it is N
pool.setMaxActive(N) 
// We want to wait if the pool is exhausted
pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK) 

また、コードで商用オブジェクトが必要な場合。

CommercialObject obj = null;
try { 
    obj = (CommercialObject)pool.borrowObject();

    // use the commerical object the way you to use it.
    // ....

} finally { 
    // be nice return the borrwed object
    try {
        if(obj != null) {
            pool.returnObject(obj);
        }
    } catch(Exception e) {
        // ignored
    }
} 

これが望まない場合は、商用ライブラリに関する詳細を提供する必要があります。

于 2008-12-22T06:59:10.443 に答える
3

Spring には、AOP 経由で使用できる org.springframework.aop.interceptor.ConcurrencyThrottleInterceptor があります (または、基になるコードをスタンドアロンで使用できます)。これは、オブジェクト プールを使用するよりも軽量なアプローチかもしれません。

于 2009-01-16T19:21:41.497 に答える
0

SessionListenerは、セッションが作成されたときにカウントをインクリメントし、セッションが無効化またはタイムアウトしたときにカウントをデクリメントし、URLへの呼び出しを保護する側面を考えています。しかし、2つのアイデアを明確に融合させたデザインは私にはわかりません。

于 2008-12-26T23:22:55.040 に答える