Java 限制对Spring MVC控制器的访问--一次访问N个会话

Java 限制对Spring MVC控制器的访问--一次访问N个会话,java,multithreading,spring,session,controller,Java,Multithreading,Spring,Session,Controller,我们已经授权了一个商业产品(在这种情况下产品并不重要),它受到并发用户数量的限制。用户通过Spring控制器访问此产品 我们有N个此产品的许可证,如果N+1用户访问它,他们会收到一条关于需要购买更多许可证的严重错误消息。我想确保用户看不到这条消息,我更希望产品的请求只是“排队”,而不是让N+1用户实际访问它。当然,他们更希望我购买许可证,所以他们的工具不允许我们本机这么做 为了不控制该工具,我想将控制器的并发会话数限制为不超过N。其他人都可以等待 我们正在使用SpringMVC 有什么想法吗?您

我们已经授权了一个商业产品(在这种情况下产品并不重要),它受到并发用户数量的限制。用户通过Spring控制器访问此产品

我们有N个此产品的许可证,如果N+1用户访问它,他们会收到一条关于需要购买更多许可证的严重错误消息。我想确保用户看不到这条消息,我更希望产品的请求只是“排队”,而不是让N+1用户实际访问它。当然,他们更希望我购买许可证,所以他们的工具不允许我们本机这么做

为了不控制该工具,我想将控制器的并发会话数限制为不超过N。其他人都可以等待

我们正在使用SpringMVC


有什么想法吗?

您需要的是一个对象池。查看apachecommons池

在应用程序启动时,您应该创建一个包含许可证或商业库对象的对象池(不确定它们有什么样的公共接口)

当您需要代码中的商业对象时

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
    }
} 

如果这不是您想要的,那么您需要提供有关您的商业库的更多详细信息。

我考虑使用SessionListener在创建会话时增加计数,在会话无效或超时时减少计数,并使用aspect来保护对URL的调用。但是,一个将这两种思想明显结合在一起的设计让我难以理解。

Spring有一个org.springframework.aop.interceptor.concurrensionthrottleinterceptor,可以通过aop使用(或者底层代码可以独立使用)。这可能是一种比使用对象池更轻的方法

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
    }
}