2013-08-26 13 views
7

Musimy wprowadzić wdzięczny mechanizm zamykania w naszej aplikacji Serwlet.Jak przetwarzać żądania serwletów podczas długiego wyłączania

EDYCJA: Chcemy, aby było to tak proste, jak to tylko możliwe, które obsługiwałoby sygnał zabicia wysyłany za pośrednictwem funkcji systemu operacyjnego. Umożliwiłoby to administratorom systemu korzystanie z wbudowanych narzędzi powłoki (kill lub taskkill w systemie Windows), w przeciwnym razie musieliby zainstalować inne narzędzie, aby "porozmawiać" z serwerem.

Mechanizm działa w dwóch etapach:

  1. żądanie wyłączenia, blokowania niektórych czynności krytycznych
  2. grupowego do poprzednio zainicjowane działania krytycznych zakończone; może to potrwać kilka godzin.

Faza # 1 jest zaimplementowana w naszej warstwie DAO. Faza # 2 jest zaimplementowana w naszym ServletContextListener # contextDestroyed metoda

Naszym problemem jest to, że po wywołaniu contextDestroyed kontener Servlet przestaje obsługiwać dalsze żądania HTTP.

EDYCJA: contextDestroyed jest wywoływana, gdy ktoś wywołuje funkcję kill systemu operacyjnego na serwerze.

Chcielibyśmy, aby aplikacja działała w fazie 2, powiadamiając użytkowników, że niektóre czynności są niedostępne.

+0

Dobre pytanie. Jeśli czynności, które mają zostać odrzucone, są implementowane w konkretnych serwletach, zawsze możesz spowodować, że te (i tylko te) zwrócą status w zakresie 4xx, jeśli wyszukiwanie DB sugeruje, że zamykanie jest w toku? –

+0

Niektóre działania są inicjowane przez działania interfejsu użytkownika, a niektóre są inicjowane przez program planujący - dlatego myślę o kontrolowaniu ich w warstwie DAO. –

Odpowiedz

4

Użyj tabeli filter, aby zachować listę wszystkich krytycznych żądań.

Po otrzymaniu żądania "przygotować zamknięcie", filtr powinien zacząć odrzucać niektóre żądania.

Napisz aplet informujący, ile jeszcze zadań krytycznych pozostało w kolejce.

W narzędziu wyłączania wyślij "przygotować zamknięcie". Odpytuj serwlet o liczbę krytycznych zadań. Kiedy osiągnie 0, wyślij rzeczywiste polecenie zamknięcia.

Aby to się stało, utwórz usługę w warstwie biznesowej, która to aranżuje. Zauważ, że wszystko musi się stać przed wywołaniemcontextDestroyed()! Twoje specjalne zamknięcie aplikacji nie pasuje do widoku J2EE na świecie, więc musisz sam nim zarządzać.

Usługa powinna być w stanie powiedzieć zainteresowanym stronom, kiedy trwa zamknięcie, jak wiele krytycznych zadań nadal działa, itp. Serwlety i filtry mogą następnie użyć tej usługi do odmowy żądań lub określenia liczby pozostałych zadań.

Po wykonaniu wszystkich zadań odrzuć wszystkie żądania, z wyjątkiem dostępu do serwletu "informacji o zamknięciu", który powinien następnie poinformować, że aplikacja jest już gotowa na śmierć.

Napisz narzędzie, które daje administratorom miły interfejs użytkownika do inicjowania zamykania aplikacji.

[EDIT] może czuć pokusę, aby zapobiec OS z zamykaniem aplikacji. Nie rób tego.

Co należy zrobić, to napisać specjalne narzędzie do zamknięcia aplikacji za pomocą dwufazowego procesu, który opisałem powyżej. Powinien to być standardowy sposób zamykania.

Tak, administratorzy skarżą się na to. W systemie Unix możesz ukryć to narzędzie, umieszczając je w skrypcie init, aby nikt tego nie zauważył. W systemie Windows może być podobne rozwiązanie.

Zabicie serwera powinno być zawsze możliwe do zatrzymania w przypadku (nie) oczekiwanych okoliczności, takich jak: błędy w kodzie wyłączania, awaryjne wyłączenie w przypadku awarii zasilania, błędy w kodzie aplikacji lub w przypadku wystąpienia Murphy'ego.

+0

Niektóre czynności są inicjowane przez działania interfejsu użytkownika, a niektóre są inicjowane przez program planujący. Filtr nie będzie działać z akcjami zainicjowanymi przez program planujący. –

+0

Filtr będzie musiał zachować listę/kolejkę w globalnym miejscu (zmienną statyczną lub wpisem w zakresie zastosowania). Umożliwia to wdrożenie go w taki sposób, aby program planujący mógł go zobaczyć. Jeśli wszystko inne zawiedzie, użyj frameworka DI. –

+0

To sprawiłoby, że warstwa logiki biznesowej "wie" o warstwie prezentacji, prawda? –

Powiązane problemy