ExecutorService no Servlet Java
Eu preciso executar algumas tarefas (principalmente chamar vários URL externos com parâmetros de solicitação e ler dados) simultaneamente no servlet java e enviar resposta ao usuário dentro de alguns segundos.Eu estou tentando usar ExecutorService para conseguir o mesmo. Preciso de quatro FutureTasks criadas em cada solicitação do usuário no método doGet. Cada tarefa é executada por cerca de 5 a 10 segundos e o tempo total de resposta para o usuário é de cerca de 15 segundos.
Você pode sugerir qual dos seguintes designs é melhor ao usar o ExecutorService em um servlet Java?
1) (Criando newFixedThreadPool por solicitação e desligando o mais rápido possível)
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) (Criando newFixedThreadPool durante Init Servlet e desligando-o em destruir servlet)
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) (Criando newCachedThreadPool durante Init Servlet e desligando-o em servlet destruir)
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();
}
}