2012-01-30 12 views
6

Poniższy program:Kiedy powstanie instancja stworzona przez serwer?

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"); 
    } 
} 

drukuje zwiększoną wartość licznika za każdym razem mam dostępu url tego apletu. Przeczytałem, że serwer tworzy instancję tego serwletu i ilekroć istnieje żądanie dla tego serwletu, nowy wątek odwzorowuje to żądanie na specjalną instancję utworzoną przez serwer.

Kiedy instancja jest tworzona przez serwer (do którego wątek odwzorowuje żądanie) umrzeć? Kiedy wątki utworzone przez nowe żądanie zginą?

+1

Czy jest to związane z konkretnym pojemnikiem? Niektóre, takie jak Google App Engine, agresywnie odzyskują aplikacje, które nie otrzymywały żądań przez pewien okres. –

+0

@ Mike Samuel nie w rzeczywistości. Ale może być zawarte w odpowiedzi/dyskusji –

+0

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

Odpowiedz

4

Instancja serwletu jest tworzona podczas uruchamiania aplikacji internetowej lub gdy jest wymagana po raz pierwszy (jeśli ustawiono opcję lazy-init). Jest usuwany, gdy twoja aplikacja zatrzymuje się, kiedy jest GCed. W normalnym środowisku produkcyjnym odważę się twierdzić, że tak naprawdę nigdy się nie dzieje (nie licząc wdrażania nowej wersji).

Większość (jeśli nie wszystkie) kontenerów serwletu działa z pulą wątków. Oznacza to, że ponownie wykorzystują wątki do obsługi żądań. Więc nici te nie umierają; wracają do puli po zakończeniu wykonywania żądania.

Oczywiście, oni umierają po zamknięciu serwera :)

z punktu widzenia z aplikacji, to naprawdę powinien starać się uczynić aplet bezpaństwowcem i można bezpiecznie pod uwagę, że każda prośba jest wykonywany w własny wątek.

+0

_ "naprawdę powinieneś spróbować zrobić twój aplet bez obywatelstwa "- czy możesz to wyjaśnić? –

+0

To znaczy, że nie należy tam przechowywać żadnego stanu aplikacji. W ten sposób nie musisz się troszczyć o to, kiedy zostanie on stworzony lub zniszczony. Najlepiej byłoby, gdybyś nie zastanawiał się, ile instancji jest tworzonych (co jest przydatne w środowisku klastrowym). –

+0

@SuhailGupta, w prostych słowach, nie używaj żadnych zmiennych statycznych w Servletach. – kosa

Powiązane problemy