2012-01-30 4 views
6

Il seguente programma:Quando l'istanza creata dal server muore?

public class SimpleCounter extends HttpServlet { 

    int counter=0; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/plain"); 
     PrintWriter writer = response.getWriter(); 
     counter++; 
     writer.println("accessed " + counter + " times"); 
    } 
} 

stampa il valore incrementato del contatore ogni volta che accedere all'URL di questa servlet. Ho letto che il server crea un'istanza di questo servlet e ogni volta che c'è una richiesta per questo servlet un nuovo thread associa questa richiesta all'istanza speciale creata dal server.

Quando l'istanza creata dal server (a quale thread viene associata la richiesta) muore? Quando finiscono i thread creati da una nuova richiesta?

+1

Si tratta di un contenitore specifico? Alcuni, come Google App Engine, rivendicano aggressivamente le app che non hanno ricevuto richieste per un periodo di tempo. –

+0

@ Mike Samuel non in realtà. Ma potrebbe essere incluso nella risposta/discussione –

+0

Correlati: http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading – BalusC

risposta

4

L'istanza servlet viene creata all'avvio della webapp o quando è richiesta per la prima volta (se è impostato lazy-init). È smaltito quando la tua webapp si ferma, quando è GCed. In un normale ambiente di produzione, oserei affermare che ciò non accade mai realmente (senza contare la distribuzione di una nuova versione).

La maggior parte (se non tutti) i contenitori servlet funzionano con un pool di thread. Ciò significa che riutilizzano i thread per gestire le richieste. Quindi questi fili non muoiono mai; tornano al pool quando finiscono di eseguire la richiesta.

Naturalmente, essi muoiono quando si arresta il server :)

Dal punto di vista dalla vostra applicazione, si dovrebbe cercare di rendere il vostro servlet senza stato, e si può tranquillamente considerare che ogni richiesta viene eseguito in il suo thread dedicato

+0

_ "dovresti davvero provare a fare il tuo servo apolide "_ puoi spiegare questo? –

+0

Significa che non dovresti mantenere nessuno stato di applicazione. In questo modo non devi preoccuparti quando viene creato o distrutto. Idealmente, non dovresti nemmeno preoccuparti di quanti sono istanziati (che è utile in un ambiente cluster). –

+0

@SuhailGupta, in parole semplici, non usare alcuna variabile statica in Servlet. – kosa