La quetione è spinosa. Lavori molto lunghi (addirittura che impiegano ORE) non devono essere fatti all'interno del metodo service() della servlet. La Servlet dovrebbe sempre compiere lavori snelli (poco pesanti) e/o quantomeno rimanere entro il termine "universale" dei 60 secondi.
Invertire le istruzioni non ha alcun senso: l'output della servlet viene inviato al client quando termina il metodo service().
La cosa va fatta in modo molto ponderato tramite l'uso di thread (cosa che nelle web-application è altamente sconsigliata).
Esiste la possibilità di appoggiarsi a librerie già fatte per questo genere di cose: una delle più famose è Quartz (mai usata in vita mia, non la conosco).
Se si vuole si può anche fare tutto a mano, ma è necessario prestare molta attenzione a quel che si fa.
Esempio:
Nel metodo init() della Servlet è possibile istanziare un Executor (vedi classe Executors) con un pool fisso di thread (in modo da evitare che vengano generati troppi thread).
Nel metodo service() della Servlet, si sottomette un Task che verrà eseguito dalla JVM non appena possibile.
Nel metodo destroy() della Servlet ci si deve preoccupare di far terminare tutti i thread ed il thread-pool executor.
Con un po' di codice:
codice:
// Siamo nella Servlet
private ExecutorService executor;
@Override
public void init() {
...
executor = Executors.newFixedThreadPool( 20 ); // Al massimo 20 thread
...
}
@Override
public void destroy() {
executor.shutdownNow(); // IMPORTANTE: deallochiamo tutto
// E' possibile chiamare in alternativa "shutdown()" se si vuole ATTENDERE che i task
// precedentemente sottomessi vengano eseguiti... ma questo può causare problemi
// di responsività nel Servlet Container
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
...
// X è il tipo di ritorno previsto dall'elaborazione
// TuoLavoro è la tua classe (che implementa Callable<X>), che effettua il lavoro pesante
Future<X> risultatoElaborazione = executor.submit( new TuoLavoro(...) );
...
// Mandiamo subito in output la response al client
out.println("<script>window.location=\"http://localhost:8080/myproject/result.jsp");
out.println("alert (\"Servlet ok\");</script>");
}
Ciao.