Co oznacza wartość serwletu <load-on-startup>


174

Jestem tu trochę zdezorientowany. W naszej aplikacji mamy zdefiniowane kilka serwletów. Oto fragment z web.xmljednego z serwletów:

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

Zgodnie z moim rozumieniem wartość parametru the <load-on-startup>musi być dodatnią liczbą całkowitą, aby została załadowana automatycznie. Wyszukałem w Google, ale odpowiedzi, które znalazłem, tylko pogłębiły moje zamieszanie.

Odpowiedzi:


186

Resin 3.0 dokumentuje to zachowanie:

Funkcja load-on-startup może określać (opcjonalną) wartość całkowitą. Jeśli wartość wynosi 0 lub więcej, oznacza to kolejność ładowania serwletów, a serwlety o wyższych numerach są ładowane po apletach o niższych numerach.

Specyfikacja JSP 3.1 (JSR 340) mówi to na stronach 14-160:

Element load-on-startupwskazuje, że ten serwlet powinien zostać załadowany (utworzony i wywołany init ()) podczas uruchamiania aplikacji WWW. Zawartość elementu tego elementu musi być liczbą całkowitą określającą kolejność ładowania serwletu. Jeśli wartość jest ujemną liczbą całkowitą lub element nie jest obecny, kontener może załadować serwlet w dowolnym momencie. Jeśli wartość jest dodatnią liczbą całkowitą lub 0, kontener musi załadować i zainicjować serwlet podczas wdrażania aplikacji. Kontener musi gwarantować, że aplety oznaczone niższymi liczbami całkowitymi będą ładowane przed apletami oznaczonymi wyższymi liczbami całkowitymi. Kontener może wybrać kolejność ładowania serwletów o tej samej load-on-startupwartości.

Prawdopodobnie chcesz sprawdzić nie tylko JSR, ale także dokumentację swojego kontenera internetowego. Mogą występować różnice


Cletus myli się w swojej odpowiedzi. Powinieneś rozważyć edycję postu.
Alboz

3
Co się dzieje, gdy obciążenie przy uruchomieniu nie jest określone?
Nirmal

1
@Nirmal Drugi akapit określa, że ​​jeśli element nie jest obecny, zachowuje się tak samo, jak gdyby był ujemny, tj. Kontener może załadować serwlet w dowolnym momencie.
Finnegan

129

Krótka odpowiedź : wartość> = 0 oznacza, że ​​serwlet jest ładowany podczas wdrażania aplikacji internetowej lub podczas uruchamiania serwera. wartość <0: serwlet jest ładowany zawsze, gdy kontener ma na to ochotę.

Długa odpowiedź (ze specyfikacji):

Element load-on-startup wskazuje, że ten aplet powinien zostać załadowany (utworzony w instancji i wywoływany z init ()) podczas uruchamiania aplikacji internetowej. Opcjonalna zawartość tych elementów musi być liczbą całkowitą określającą kolejność ładowania serwletu. Jeśli wartość jest ujemną liczbą całkowitą lub element nie jest obecny, kontener może załadować serwlet w dowolnym momencie. Jeśli wartość jest dodatnią liczbą całkowitą 128 lub 0, kontener musi załadować i zainicjować serwlet podczas wdrażania aplikacji. Kontener musi gwarantować, że aplety oznaczone niższymi liczbami całkowitymi będą ładowane przed apletami oznaczonymi wyższymi liczbami całkowitymi. Kontener może wybrać kolejność ładowania serwletów o tej samej wartości obciążenia przy uruchomieniu.


1
I dlatego zaznaczamy 0 dla DispatcherServlet inorder, aby załadować go jako pierwszy podczas uruchamiania aplikacji.
Lucky

11

Wskazuje, że serwlet nie zostanie uruchomiony, dopóki żądanie nie spróbuje uzyskać do niego dostępu.

Jeśli obciążenie przy uruchamianiu jest większe lub równe zero, wtedy gdy kontener się uruchomi, uruchomi ten serwlet w kolejności rosnącej obciążenia przy uruchamianiu, które tam umieściłeś (tj. 0, 1, potem 2, potem 5, potem 10 i tak dalej) .


7
Zero również powoduje ładowanie. Tylko wartości ujemne nie są gwarantowane: "[...] Jeśli wartość jest dodatnią liczbą całkowitą lub 0, kontener musi załadować i zainicjować serwlet podczas wdrażania aplikacji. [...]"
marabol

1
@cletus Myślę, że lepiej jest zmodyfikować wartość większą od zera przez wartość większą lub równą zero , ponieważ wielu użytkowników czyta Twoją odpowiedź zgodnie z zaakceptowaną. Z góry dziękuję
Tarik

9

Cykl życia serwletu

Cykl życia serwletu jest kontrolowany przez kontener, w którym został on wdrożony. Gdy żądanie jest mapowane na serwlet, kontener wykonuje następujące kroki.

  1. Jeśli instancja serwletu nie istnieje, kontener WWW:

    za. Ładuje klasę serwletu

    b. Tworzy instancję klasy serwletu

    do. Inicjuje instancję serwletu przez wywołanie metody init (inicjalizacja jest opisana w Tworzenie i inicjowanie serwletu )

  2. Kontener wywołuje metodę usługi, przekazując obiekty żądań i odpowiedzi. Metody usług są omówione w pisaniu metod usługi .

Wartość 0 load-on-startupoznacza, że ​​punkt 1 jest wykonywany, gdy żądanie przychodzi do tego serwletu. Inne wartości oznaczają, że punkt 1 jest wykonywany podczas uruchamiania kontenera.


bezbłędna odpowiedź!
gaurav

1

Jak stwierdzono w innej odpowiedzi i ten artykuł dotyczący ładowania przy uruchamianiu, zero jest akceptowalne, a przy braku jakiegokolwiek innego serwletu będzie to miało pierwszeństwo podczas ładowania i ładowania podczas wdrażania. Najlepszym zastosowaniem statup typu load-on jest ładowanie serwletów, których inicjalizacja zajmuje więcej czasu, zanim nadejdzie pierwsze żądanie, tak jak aplety, które tworzą pulę połączeń, wykonują połączenie sieciowe lub przechowują duże zasoby, co znacznie skróci czas odpowiedzi dla pierwszych kilku żądań.


1
  1. Jeśli wartość jest taka sama dla dwóch serwletów, zostaną one załadowane w kolejności, w jakiej są zadeklarowane w pliku web.xml.
  2. jeśli jest równe 0 lub ujemna liczba całkowita, to Servlet zostanie załadowany, gdy Container zechce je załadować.
  3. gwarantuje ładowanie, inicjalizację i wywołanie metody init () serwletu przez kontener WWW.
  4. Jeśli nie ma elementu dla żadnego serwletu, zostaną one załadowane, gdy kontener WWW zdecyduje się je załadować.

0

tak, może mieć tę samą wartość ... powodem podania liczb do ładowania przy starcie jest zdefiniowanie kolejności, w jakiej serwer będzie ładował cały serwlet. Aplet z wartością obciążenia przy uruchomieniu 0 zostanie załadowany jako pierwszy, a aplet z wartością 1 zostanie załadowany później.

jeśli dwa serwlety będą miały taką samą wartość ładowania przy starcie, to będzie ładowane w sposób zadeklarowany w pliku web.xml od góry do dołu. serwlet, który znajduje się jako pierwszy w pliku web.xml, zostanie załadowany jako pierwszy, a drugi zostanie załadowany później.


0

-> Znacznik (Brak obciążenia przy uruchomieniu) Po pierwsze, kiedy serwlet jest wdrażany na serwerze, za utworzenie obiektu serwletu odpowiada serwer. Np .: Załóżmy, że serwlet jest wdrożony na serwerze, (obiekt serwletu nie jest dostępny na serwerze) klient wysyła żądanie do serwletu po raz pierwszy, a następnie serwer tworzy obiekt serwletu za pomocą domyślnego konstruktora i natychmiast wywołuje init (). Od tego momentu, gdy klient wyśle ​​żądanie, zostanie wykonana tylko metoda usługi, ponieważ obiekt jest już dostępny

Jeśli w deskryptorze wdrażania używany jest znacznik ładowania przy uruchamianiu: W czasie wdrażania sam serwer tworzy obiekt serwletu dla serwletów na podstawie wartości dodatniej podanej między znacznikami. Tworzenie obiektów dla klas serwletów będzie następowało od 0-128 0, a najpierw zostanie utworzony serwlet liczbowy, a za nim inne numery.

Jeśli podamy tę samą wartość dla dwóch serwletów w pliku web.xml, wówczas tworzenie obiektów zostanie wykonane na podstawie pozycji klas w pliku web.xml, również różni się w zależności od serwera.

Jeśli podamy wartość ujemną pomiędzy ładowaniem tagu startowego, serwer nie utworzy obiektu serwletu.

Inne scenariusze, w których serwer tworzy obiekt dla serwletu.

Jeśli nie użyjemy load on start up tag w web.xml, projekt jest wdrażany, gdy klient wysyła żądanie po raz pierwszy, gdy serwer tworzy obiekt, a serwer jest odpowiedzialny za wywołanie jego metod cyklu życia. Następnie, jeśli .class został zmodyfikowany na serwerze (tomcat). klient ponownie wysyła żądanie zmodyfikowanego serwletu, ale w przypadku tomcat nowy obiekt nie zostanie utworzony, a serwer będzie wykorzystywał istniejący obiekt, chyba że nastąpi restart serwera. Ale w klasie logiki sieciowej, kiedy plik .class jest modyfikowany na serwerze bez ponownego uruchamiania serwera, jeśli otrzyma żądanie, serwer wywołuje metodę zniszczenia na istniejącym serwlecie i tworzy nowy obiekt serwletu i wywołuje init () w celu jego zainicjowania .


-1

Jeśli wartość wynosi <0, serlet jest tworzony, gdy przychodzi żądanie, w przeciwnym razie> = 0 kontener zostanie załadowany w kolejności rosnącej wartości. jeśli 2 lub więcej serwletów ma tę samą wartość, to kolejność serwletów zadeklarowana w pliku web.xml.


-2

Kontener serwletów ładuje serwlet podczas uruchamiania lub podczas wysyłania pierwszego żądania. Ładowanie serwletu zależy od atrybutu „load-on-startup” w pliku „web.xml”. Jeśli atrybut ma dodatnią liczbę całkowitą (od 0 do 128), to serwlet jest ładowany ładowaniem kontenera, w przeciwnym razie ładuje się, gdy przychodzi pierwsze żądanie usługi.

Gdy aplet jest ładowany po otrzymaniu żądania, nazywa się to „ładowaniem z opóźnieniem”.


-6

Jest to proste, czego nawet się nie spodziewasz.

Jeśli wartość jest dodatnia, jest ładowana podczas uruchamiania kontenera

Jeśli wartość nie jest dodatnia, to serwelet jest ładowany w momencie wykonania żądania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.