Jedną z pierwszych rzeczy, których nauczyłem się o programowaniu Java EE, jest to, że nie powinienem tworzyć własnych wątków w kontenerze Java EE. Ale kiedy o tym myślę, nie znam powodu.
Czy możesz jasno wyjaśnić, dlaczego jest to odradzane?
Jestem pewien, że większość aplikacji korporacyjnych wymaga pewnego rodzaju zadań asynchronicznych, takich jak demony pocztowe, sesje bezczynności, zadania czyszczenia itp.
Jeśli więc rzeczywiście nie powinno się tworzyć wątków, jaki jest właściwy sposób na zrobienie tego w razie potrzeby?
java
multithreading
jakarta-ee
LiorH
źródło
źródło
Odpowiedzi:
Nie jest to zalecane, ponieważ wszystkie zasoby w środowisku mają być zarządzane i potencjalnie monitorowane przez serwer. Ponadto większość kontekstu, w którym używany jest wątek, jest zwykle dołączona do samego wątku wykonania. Jeśli po prostu uruchomisz swój własny wątek (na co uważam, że niektóre serwery nawet nie pozwalają), nie będzie on mógł uzyskać dostępu do innych zasobów. Oznacza to, że nie można uzyskać kontekstu początkowego i wyszukiwać JNDI w celu uzyskania dostępu 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.
Wspólny program WorkManager jest wspólny dla produktów WebSphere i WebLogic, a także innych
Więcej informacji tutaj
I tu
Również trochę powiela ten z dzisiejszego ranka
AKTUALIZACJA: Proszę zauważyć, że to pytanie i odpowiedź odnoszą się do stanu Java EE w 2009 roku. Od tego czasu sytuacja się poprawiła!
źródło
W przypadku EJB jest to nie tylko odradzane, ale wyraźnie zabronione przez specyfikację :
i
Powodem jest to, że EJB mają działać w środowisku rozproszonym. EJB można przenieść z jednego komputera w klastrze do innego. Wątki (oraz gniazda i inne ograniczone możliwości) stanowią istotną przeszkodę dla tej przenośności.
źródło
Powodem, dla którego nie powinieneś tworzyć 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ącym programistom mogą być trudne do wyobrażenia. Na przykład takie rzeczy, jak pule wątków, klastrowanie, odzyskiwanie po awarii są wykonywane przez kontener. Kiedy zaczynasz wątek, możesz stracić część z nich. Kontener umożliwia również ponowne uruchomienie aplikacji bez wpływu na maszynę JVM, na której działa. Jak byłoby to możliwe, gdyby były wątki poza kontrolą kontenera?
Z tego powodu od wersji J2EE 1.4 wprowadzono usługi timera. Więcej informacji znajdziesz w tym artykule.
źródło
Narzędzia współbieżności dla Java EE
Obecnie istnieje standardowy i poprawny sposób tworzenia wątków za pomocą podstawowego interfejsu API Java EE:
Używając Concurrency Utils, zapewniasz, ż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
źródło
Zawsze możesz powiedzieć kontenerowi, aby zaczął coś w ramach deskryptorów wdrożenia. Mogą one następnie wykonywać wszelkie czynności konserwacyjne, które musisz wykonać.
Postępować zgodnie z zasadami. Będziesz zadowolony któregoś dnia to zrobiłeś :)
źródło
Wątki są zabronione w kontenerach Java EE zgodnie z planami. Więcej informacji można znaleźć w planach .
źródło
Nie ma prawdziwego powodu, aby tego nie robić. Kiedyś Quarz z wiosną w webapp bez problemów. Można również
java.util.concurrent
użyć struktury współbieżności . Jeśli zaimplementować własną obsługę wątków ustaw theads do deamon lub użyć własnej grupy wątek deamon dla nich więc pojemnik może wyładować swoją webapp czasu.Ale uważaj, sesja bean zakresów i żądanie nie działają w utworzonych wątkach! Również inny kod
ThreadLocal
nie działa po wyjęciu z pudełka, musisz samodzielnie przenieść wartości do utworzonych wątków.źródło
Nigdy nie czytałem, że to zniechęca, poza tym, że nie jest to łatwe do wykonania poprawnie.
Jest to programowanie dość niskopoziomowe i podobnie jak inne techniki niskiego poziomu powinieneś mieć dobry powód. Większość problemów ze współbieżnością można rozwiązać znacznie efektywniej za pomocą konstrukcji wbudowanych, takich jak pule wątków.
źródło
Jeden z powodów, dla których znalazłem, jeśli odrodzisz kilka wątków w swoim EJB, a następnie spróbujesz wyładować kontener lub zaktualizować EJB, napotkasz problemy. Prawie zawsze istnieje inny sposób zrobienia czegoś, w którym nie potrzebujesz wątku, więc po prostu powiedz NIE.
źródło