Necesito realizar algunas tareas (Principalmente Llamar múltiples URL externas con parámetros de solicitud y datos de lectura) concurrentemente en servlet java y enviar respuesta al usuario en unos pocos segundos. Estoy tratando de usar ExecutorService para lograr el mismo . Necesito cuatro FutureTasks creados en cada solicitud de usuario en el método doGet. Cada tarea se ejecuta durante alrededor de 5-10 segundos y el tiempo de respuesta total para el usuario es de alrededor de 15 segundos.ExecutorService en Java Servlet
¿Puede sugerir cuál de los siguientes diseños es mejor si utiliza ExecutorService en un servlet de Java?
1) (Creación newFixedThreadPool por solicitud y apagarlo ASAP)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
myThreadPool = Executors.newFixedThreadPool(4);
taskOne = myThreadPool.submit();
taskTwo = myThreadPool.submit();
taskThree = myThreadPool.submit();
taskFour = myThreadPool.submit();
...
...
taskOne.get();
taskTwo.get();
taskThree.get();
taskFour.get();
...
myThreadPool.shutdown();
}
public void destroy()
{
super.destroy();
}
}
2) (Creación newFixedThreadPool durante el servlet de inicio y apagarlo en servlet destruir)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
//What should be the value of fixed thread pool so that it can handle multiple user requests without wait???
myThreadPool = Executors.newFixedThreadPool(20);
}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
taskOne = myThreadPool.submit();
taskTwo = myThreadPool.submit();
taskThree = myThreadPool.submit();
taskFour = myThreadPool.submit();
...
...
taskOne.get();
taskTwo.get();
taskThree.get();
taskFour.get();
...
}
public void destroy()
{
super.destroy();
myThreadPool.shutdown();
}
}
3) (Creando newCachedThreadPool durante Servlet Init y cerrándolo en servlet destroy)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
myThreadPool = Executors.newCachedThreadPool();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
taskOne = myThreadPool.submit();
taskTwo = myThreadPool.submit();
taskThree = myThreadPool.submit();
taskFour = myThreadPool.submit();
...
...
taskOne.get();
taskTwo.get();
taskThree.get();
taskFour.get();
...
}
public void destroy()
{
super.destroy();
myThreadPool.shutdown();
}
}
El contenedor crea y carga una única instancia del servlet. Y todas las solicitudes son procesadas por la misma instancia. Entonces, 'ExecutorService myThreadPool = null;' no es seguro. –
¿Puede sugerir cómo declarar ExecutorService globalmente? – user1263019