Ho bisogno di eseguire alcune attività (principalmente chiamata più URL esterni con parametri di richiesta e dati di lettura) contemporaneamente nel servlet Java e inviare risposta all'utente entro pochi secondi. Sto cercando di utilizzare ExecutorService per ottenere lo stesso . Ho bisogno di quattro FutureTask creati in ogni richiesta utente nel metodo doGet. Ogni attività viene eseguita per circa 5-10 secondi e il tempo di risposta totale per l'utente è di circa 15 secondi.ExecutorService in Java Servlet
Potete suggerire quale dei seguenti progetti è migliore durante l'uso di ExecutorService in un servlet Java?
1) (Creazione di newFixedThreadPool per richiesta e chiuderlo 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) (Creazione di newFixedThreadPool durante Servlet Init e chiuderlo sul servlet distruggere)
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) (Creazione di newCachedThreadPool durante Servlet Init e spegnimento su 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();
}
}
Il contenitore crea e carica una singola istanza del servlet. E tutte le richieste vengono elaborate dalla stessa istanza. Quindi, 'ExecutorService myThreadPool = null;' non è sicuro. –
Quindi, per favore, può suggerire come dichiarare ExecutorService a livello globale? – user1263019