ExecutorService в сервлете Java
Мне нужно выполнить некоторые задачи (в основном вызывать несколько внешних URL-адресов с параметрами запроса и читать данные) одновременно в сервлете Java и отправить ответ пользователю в течение нескольких секунд. Я пытаюсь использовать ExecutorService для достижения того же. Мне нужно четыре FutureTasks, созданных в каждом запросе пользователя в методе doGet. Каждая задача выполняется в течение 5-10 секунд, а общее время ответа пользователя составляет около 15 секунд.
Можете ли вы предложить, какой из следующих дизайнов лучше при использовании ExecutorService в сервлете Java?
1)(Creating newFixedThreadPool per request and shutting it down 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) (Creating newFixedThreadPool during Servlet Init and shutting it down on servlet destroy)
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) (Creating newCachedThreadPool during Servlet Init and shutting it down on 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();
}
}