2009-02-16 15 views
5

Dzisiaj naprawiłem błąd w aplikacji, która mogła doprowadzić do nieskończonej pętli w cyklu żądania/odpowiedzi serwletu.Niekończąca się pętla w serwlinie - możliwe odzyskanie?

Po prostu z ciekawości: co się stanie, jeśli mój serwlet zostanie uwięziony w pętli for (;;)?

Czy można jakoś odzyskać? Czy tomcat wykryje to? Czy ta instancja może zostać zabita bez restartowania serwera?

Czy jest to jedna z najgorszych rzeczy, które mogą się wydarzyć i bardzo szybki sposób na zabicie kontenera sieciowego?

EDIT: To była prawdziwa niekończąca się pętla, która cały czas zużywała procesor, ale nie pamięć. Trzymałem go przez kilka minut. Myślę, że mogę potwierdzić, że tomcat nie wykryje tego typu rzeczy :-)

Odpowiedz

1

Nie sądzę, że Tomcat wykryje nieskończoną pętlę. Możesz zatrzymać serwlet za pomocą menedżera Tomcat, jeśli serwlet nie zużywa całego czasu procesora z jego pętlą. W przeciwnym razie prawdopodobnie najbezpieczniej jest po prostu zrestartować serwer.

To dlaczego robisz rozległe testy lokalnie przed wdrożeniem aplikacje ;-) i być bardzo ostrożnym, że wszystkie pętle mają warunki wyjścia ...

+0

Powiedzmy, że błąd został wykryty, zanim spowodował problemy z produkcją ;-) –

+0

Dobrze! I na pewno nie chciałem brzmieć protekcjonalnie - jestem pewien, że wiesz, jak ważne jest testowanie. –

+0

Nie martw się - nie zrobiłeś –

1

Nie wiem, czy Tomcat ma takie wykrywanie, ale np. Robi to kontener WWW Websphere. Jednak w oczywisty sposób pojemnik zabiera stosunkowo dużo czasu, aby wykryć wątek "zawieszony". Serwer pod obciążeniem może być łatwo i szybko zabity przez taki kod.

+0

Hej - dobrze wiedzieć, że websphere wykrył coś takiego. Dzięki za informację –

1

jeśli nieskończona pętla jest spowodowane przez niekończącą przekierowania, to będzie prędzej czy później zamknij to żądanie za pomocą wyjątku StackOverflowException.

To jest "prawdziwa" nieskończona pętla, możesz trącić jeden procesor/rdzeń na stałe i ostatecznie zawiesić całą aplikację z OutOfMemoryException.

tomcat ma, o ile wiem, jednoznaczne wykrywanie tych problemów.

0

Mogę sobie wyobrazić, że można sobie z tym poradzić z odpowiednim ustawieniem limitu czasu:

http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html

+0

Hm ... Jesteś pewien? Przeczytałem dokument, który połączyłeś i nie widzę, w jaki sposób te zegary mogą wykryć wątek "zawieszony" (w zasadzie zablokowany na żywo). Proszę popraw mnie jeżeli się mylę! –

+0

Limity czasu oczekiwania związane są z łącznikiem JK, który łączy Tomcat z Apache. Więc nie, prawdopodobnie nie pomogą. –

Powiązane problemy