ExecutorService w Java Servlet
Muszę wykonywać pewne zadania (głównie wywoływać wiele zewnętrznych adresów URL z parametrami żądania i odczytywać dane) jednocześnie w serwletach java i wysyłać odpowiedzi do użytkownika w ciągu kilku sekund. Potrzebuję czterech FutureTasków utworzonych w każdym żądaniu użytkownika w metodzie doGet. Każde zadanie trwa około 5-10 sekund, a całkowity czas odpowiedzi dla użytkownika wynosi około 15 sekund.
Czy możesz zasugerować, który z poniższych projektów jest lepszy podczas korzystania z ExecutorService w serwletu Java?
1) (Tworzenie nowegoFixedThreadPool na żądanie i wyłączanie 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) (Tworzenie newFixedThreadPool podczas uruchamiania serwletu i wyłączanie go w celu zniszczenia serwletu)
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) (Tworzenie newCachedThreadPool podczas uruchamiania serwletu i wyłączanie go po zniszczeniu serwletu)
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();
}
}