2012-04-26 7 views
5

Gdy żądanie dociera do serwletu, który obsługuje przesyłanie plików, czy dobrze jest rozpocząć nowy wątek w tym apletie, używając new Thread(r).start(), który obsłuży inny fragment danych dołączony do pliku, który był przesłane. Chciałem to zrobić równolegle do obu zadań.uruchamianie nowego wątku w serwlecie

+0

Odradzałbym się przeciwko niemu, chyba że użyjesz łączenia wątków. Alternatywnie, Servlet 3 ma teraz asynchroniczne wywołanie serwisowe, dlaczego by tego nie zbadać? –

+0

z którego serwera aplikacji korzystasz? czy zapewnia pewnego rodzaju wsparcie dla długotrwałych zadań? – BigMike

+0

@BigMike Glassfish 3.1.1 – saplingPro

Odpowiedz

17

To nie tylko zły pomysł, ale także nie zadziała. Oto dlaczego: Twoja prośba o przesłanie pliku zakończy się ostatecznie metodą doPost(). Dopóki jesteś w tej metodzie, kontener utrzymuje połączenie otwarte. Po powrocie z tej metody (i jeśli zdecydujesz się obsłużyć przychodzące dane w osobnym wątku, doPost() zakończy się wcześniej) kontener zakłada, że ​​skończyłeś z żądaniem i zamknie połączenie. Z punktu widzenia klienta ładowanie zostało przerwane przez serwer. A ze względu na asynchroniczny charakter wątków przerwa nastąpi w losowym momencie.

Uwierzcie mi, niektórzy użytkownicy już doświadczyli tego: HttpServletResponse seems to periodically send prematurely.

Ponadto nie jest dobrym pomysłem, aby rozpocząć nowy wątek na żądanie, ponieważ ten skaluje się słabo (a nawet jest zabronione przez niektóre specyfikacje). To, co możesz zrobić, to użyć asynchronicznego żądania Servlet 3.0 i obsługiwać asynchronicznie, ale najlepiej przy użyciu puli wątków. Zobacz także: Why create new thread with startAsync instead of doing work in servlet thread?.

+0

... Zły pomysł, chyba że trzeba wykonać długotrwałe zadanie wymagające dużego obciążenia procesora. –

+0

@Tomasz Nurkiewicz, nawet jeśli utrzymuję pracę nowego wątku wewnątrz metody 'doPost()' tego serwletu? – saplingPro

+0

@Tomasz Nurkiewicz będzie w porządku wysłać nową prośbę do innego serwletu z metody run wątku, metoda postu tego serwletu? –

-5

Nie ma nic złego w rozpoczynaniu nowego wątku w Servlet (w przeciwieństwie do EJB), więc tak, jest w porządku.

EDYCJA: druga myśl @Tomasz Nurkiewicz ma rację. Przesyłanie pliku zostanie zatrzymane.

+0

To nieprawda. Należy zarządzać pisaniem wątku w środowisku współbieżnym. –

+0

Tak długo, jak wątek nie używa żadnych zmiennych nielokalnych (pola w serwlecie), nie ma problemu. Zakładam, że wszystko dzieje się w metodzie doGet/doPost –

-2

Serwlety są niejawnie uruchamiane w nowych wątkach przez serwer WWW, więc za każdym razem, gdy dowolne żądanie trafi w serwlet, zostanie wykonane w innym wątku. Nie przewiduję powodu, aby utworzyć nowy wątek samodzielnie

+0

może po prostu nie po to, aby klient był zamrożony (jeśli wątek jest czasochłonny?) – BigMike

+0

Tak więc użytkownik nie musi czekać na zakończenie apletu przez serwleta –

+0

http: //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –