java - requestmapping - Limite el acceso a un controlador Spring MVC: N sesiones a la vez
spring dispatcherservlet (3)
Lo que necesitas es un ObjectPool. Echa un vistazo a Apache Commons Pool http://commons.apache.org/pool
Al inicio de la aplicación, debe crear un Conjunto de objetos con licencias u objetos de la biblioteca comercial (No estoy seguro de qué tipo de interfaz pública tienen).
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)
Y cuando necesita el objeto comercial en su código.
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
}
}
Si esto no es lo que quieres, entonces deberás proporcionar más detalles sobre tu biblioteca comercial.
Hemos licenciado un producto comercial (producto no importante en este contexto), que está limitado por el número de usuarios simultáneos. Los usuarios acceden a este producto pasando por un controlador de primavera.
Tenemos N licencias para este producto, y si los usuarios de N + 1 acceden a él, reciben un desagradable mensaje de error sobre la necesidad de comprar más licencias. Quiero asegurarme de que los usuarios no vean este mensaje, y preferiría que las solicitudes al producto simplemente "hagan cola", en lugar de que los usuarios de N + 1 realmente accedan a él. Por supuesto, preferirían que compre las licencias, por lo que su herramienta no nos permitirá hacerlo de forma nativa.
En lugar de poder controlar la herramienta, me gustaría limitar el número de sesiones simultáneas al controlador para que nunca sean más que N. Todos los demás pueden esperar.
Estamos usando Spring MVC.
¿Algunas ideas?
Spring tiene un org.springframework.aop.interceptor.ConcurrencyThrottleInterceptor que se puede usar a través de AOP (o el código subyacente se puede usar de forma independiente). Eso podría ser un enfoque más ligero que usar un grupo de objetos.
Estoy pensando en un SessionListener para incrementar el conteo cuando se crea una sesión y disminuirla cuando la sesión se invalida o se agota y un aspecto para proteger las llamadas a la URL. Pero un diseño que claramente combina ambas ideas me está eludiendo.