Visualizzazione dei risultati da 1 a 4 su 4

Visualizzazione discussione

  1. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    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.
    Ultima modifica di LeleFT; 09-09-2014 a 17:27
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.