同じユーザーからの複数のリクエストを並行して処理しない従来のシステムのため、同時呼び出しの量を制限する必要があります。目標は、サービスへの同時リクエスト数を 1 pr に制限することです。user (session) - ただし、すべてのユーザーをブロックしないようにします。クライアント側ですべての ajaxrequests をキューに入れることができましたが、それは特定の呼び出しにのみ適用される問題に対する大ハンマーの解決策のように思えます。できればサーバー側で解決したい。
代替。1: 考えられる問題は、autowired サービスが spring によって注入された (requestscope による) プロキシであり、注入されたプロキシ参照が要求間で変更される可能性があることでしょうか? それとも、Spring は同じプロキシを再利用しますか? その場合、それは機能しますか?
@Scope("session")
public class Model {
@Autowired
Service service;
public List<Pojo> getPojos() {
synchronized(service) {
if(!hasTriedToRetrievePojos) {
hasTriedToRetrievePojos = true;
service.getPojos();
}
}
}
}
@Scope("request")
// Actually a LegacyService, wrapping an old legacysystem
public class Service {
...
}
代替。2: Spring がこのモデル pr のインスタンスを 1 つだけ構築する場合。これは意図したとおりに機能するはずです。
@Scope("session")
public class Model {
private Object lock = new Object();
@Autowired
Service service;
public List<Pojo> getPojos() {
synchronized(lock) {
if(!hasTriedToRetrievePojos) {
hasTriedToRetrievePojos = true;
service.getPojos();
}
}
}
}
代替。3: モデルに HttpSession を挿入し、手動で HttpSessionプロパティを同期します ( Is HttpSession thread safe, are set/get Attribute thread safe operations?の最も支持された回答によると)。春の混乱はありませんが、より面倒です。
スティッキー セッションを使用している場合、セッション パラメーターの同期は、クラスター化された環境でも安全であると認識していますか?