Dlaczego odradzamy tworzenie wątków w kontenerze Java EE?

Jedną z pierwszych rzeczy, których nauczyłem się na temat rozwoju Java EE jest to, że nie powinienem tworzyć własnych wątków wewnątrz kontenera Java EE. Ale kiedy o tym myślę, nie znam powodu.

Czy możesz jasno wyjaśnić, dlaczego jest zniechęcany?

Jestem pewien, że większość aplikacji korporacyjnych potrzebuje pewnego rodzaju zadań asynchronicznych, takich jak demony poczty, bezczynne sesje, zadania czyszczenia itp.

Więc jeśli rzeczywiście nie powinno się odradzać wątków, to jaki jest właściwy sposób, aby to zrobić, gdy potrzebne?

Author: Peter O., 2009-02-10

9 answers

Jest to zniechęcające, ponieważ wszystkie zasoby w środowisku mają być zarządzane i potencjalnie monitorowane przez serwer. Ponadto większość kontekstu, w którym wątek jest używany, jest zazwyczaj dołączana do samego wątku wykonania. Jeśli po prostu założysz własny wątek (który, jak sądzę, niektóre serwery nawet nie pozwolą), nie będzie on mógł uzyskać dostępu do innych zasobów. Oznacza to, że nie można uzyskać InitialContext i wykonywać wyszukiwania JNDI, aby uzyskać dostęp do innych zasobów systemowych, takich jak Fabryki połączeń JMS i źródła danych.

Istnieją sposoby, aby to zrobić "poprawnie", ale zależy to od używanej platformy.

Commonj WorkManager jest wspólny dla WebSphere i WebLogic oraz innych

Więcej informacji tutaj

I tutaj

Również nieco duplikuje ten od dzisiejszego ranka

UPDATE: proszę zauważyć, że to pytanie i odpowiedź odnoszą się do stanu Java EE w 2009 roku, rzeczy mają poprawione od tego czasu!

 82
Author: Robin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:04

Dla EJB jest to nie tylko zniechęcające, ale wyraźnie zabronione przez specyfikację :

Przedsiębiorstwo nie może używać wątku synchronizacja primitives to synchronizacja wykonywania wielu przypadki.

I

The enterprise bean nie może próbować do zarządzania wątkami. Przedsiębiorstwo bean nie może próbować zacząć, zatrzymać, zawiesić lub wznowić wątek, lub do Zmień priorytet lub nazwę wątku. Przedsiębiorstwo musi nie próba do zarządzania grupami wątków.

Powodem jest to, że EJB mają działać w środowisku rozproszonym. EJB może być przenoszony z jednej maszyny w klastrze do drugiej. Wątki (i gniazda i inne ograniczone urządzenia) stanowią istotną barierę dla tej przenośności.

 32
Author: Dan Dyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 23:06:58

Powodem, dla którego nie powinieneś wywoływać własnych wątków, jest to, że nie będą one zarządzane przez kontener. Kontener zajmuje się wieloma rzeczami, które początkujący programista może sobie wyobrazić. Kontener wykonuje na przykład łączenie wątków, grupowanie, odzyskiwanie awarii. Po uruchomieniu wątku możesz stracić niektóre z nich. Kontener pozwala również na ponowne uruchomienie aplikacji bez wpływu na JVM, na którym działa. Jak byłoby to możliwe, gdyby były wątki kontroli kontenera?

To powód, dla którego od J2EE 1.4 wprowadzono usługi timera. Zobacz ten Artykuł po szczegóły.

 12
Author: kgiannakakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-23 04:40:02

Concurrency Utilities for Java EE

Istnieje obecnie standardowy i poprawny sposób tworzenia wątków z rdzeniem Java EE API:

Używając Utils współbieżności, upewniasz się, że Twój nowy wątek jest tworzony i zarządzany przez kontener, gwarantując, że wszystkie usługi EE są dostępne.

Przykłady tutaj

 6
Author: Chris Ritchie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:20

Zawsze możesz powiedzieć kontenerowi, aby zaczął pracę jako część deskryptorów wdrażania. Mogą one wykonywać wszelkie zadania związane z konserwacją, które musisz wykonać.

Przestrzegaj zasad. Kiedyś się ucieszysz:)

 2
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 19:56:02

Wątki są zabronione w kontenerach Java EE zgodnie ze schematami. Więcej informacji można znaleźć w schematach .

 2
Author: Ojitha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-23 10:55:10

Nie ma prawdziwego powodu, by tego nie robić. Użyłem Quarzz Spring w webapp bez problemów. Można również użyć frameworka współbieżności java.util.concurrent. Jeśli zaimplementujesz własną obsługę wątków, Ustaw theads na deamon lub użyj dla nich własnej grupy wątków deamon, aby kontener mógł rozładować Twoją webapp w dowolnym momencie.

Ale uważaj, zakresy fasoli session i request nie działają w wątkach! Również inne kody na ThreadLocal nie działa po wyjęciu z pudełka, musisz samodzielnie przenieść wartości do spawanych wątków.

 2
Author: Arne Burmeister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-22 06:03:49

Nigdy nie czytałem, że to zniechęca, z wyjątkiem tego, że nie jest łatwo zrobić poprawnie.

Jest to dość niskopoziomowe programowanie i podobnie jak inne niskopoziomowe techniki powinieneś mieć dobry powód. Większość problemów z współbieżnością może być rozwiązywana znacznie efektywniej przy użyciu wbudowanych konstrukcji, takich jak pule wątków.

 1
Author: levand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 19:28:42

Jeden z powodów, dla których znalazłem, Jeśli pojawi się kilka wątków w Twoim EJB, a następnie spróbujesz rozładować kontener lub zaktualizować swój EJB, napotkasz problemy. Prawie zawsze jest inny sposób na zrobienie czegoś, w którym nie potrzebujesz wątku, więc po prostu powiedz nie.

 0
Author: Javamann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 22:40:05