Witam. Zastanawiam się jak w praktyce wygląda sprawa z tworzeniem własnych wątków w aplikacjach webowych pisanych w Javie EE czy też Springu. Z tego co wyczytałem tworzenie własnych wątków w aplikacjach webowych gdzie wykorzystujemy serwer czy kontener aplikacyjny nie jest zalecane i może doprowadzić do nieprzewidywanych zachowań naszej aplikacji. Wynika to z faktu, że serwery aplikacyjne same tworzą wątki i zarządzają nimi, a utworzenie własnego wątku powoduje, że nie jest on zarządzany przez serwer i nikt nie ma nad nimi kontroli. Takie wątki nie będą zsynchronizowane z wątkami serwera i mogą doprowadzić do niepożądanych zachowań. Osobiście raz spotkałem się z sytuacją, że ktoś stworzył własne wątki w aplikacji JEE, które wywoływały metody odpowiedzialne za zapis do bazy danych. W konsekwencji doprowadziły to do tego, że na bazie potworzyły się jakieś dziwne locki na bazie i aplikacja przestała działać jak należy. Po usunięciu tych wątków wszystko wróciło do normy. Chciałbym zapytać bardziej doświadczone osoby czy faktycznie tworzenie takich wątków jest złą i niezalecaną praktyką i dobrze rozumiem powody, dla których nie należy tego robić? Jakie jest wasze zdanie na ten temat i jak do tego podchodzicie, czy może spotkaliście się z sytuacją tworzenia wątków w aplikacjach serwerowych, np. u siebie w pracy?
Wątków czy wyjątków? Mieszasz terminologię.
Ps: w tytule pewnie literówka. Wątki potrafią być bardzo użyteczne jeżeli się z nich umie korzystać, i potrafią też być bardzo ciężkie do zdebugowania jeżeli się nie umie. Myślę jednak że źle użyte wątki popsują nie tylko backendową aplikację ale raczej każdą.
Po pierwsze po co chcesz tworzyć te wątki? Nie miałem jeszcze takiej sytuacji aby wymagała recznego tworzenia watkow
Wątków nowych na ogół się nie tworzy w sposób jawny
Co najwyżej tworzy się metody asynchroniczne np. wysyłać zapytanie POST którego przetwarzanie zajmuje bardzo długo - możesz mieć asynchroniczny serwis który zacznie wykonywać metodę a controller już zakończy pracę nad requestem
W JavaEE powinieneś raczej uruchamiać wątki przez ManagedExecutorService, poza tym jest to temat który jest jeszcze "doprecyzowywany" w specyfikacji (to jest spec. "JavaEE concurrency utilities" czy jakoś tak).
Korzystaj z wyższych abstrakcji.
ManagedExecutorService - JavaEE
ThreadPoolTaskExecutor - Spring
Sprawdzaj czy wątki są ubijane jak np. appka zostanie wyłączona.