Używam języka Java i chcę, aby serwlet działał nieprzerwanie w mojej aplikacji, ale nie rozumiem, jak to zrobić. Mój serwlet ma metodę, która codziennie podaje liczbę użytkowników z bazy danych, a także całkowitą liczbę użytkowników z całej bazy danych. Dlatego chcę, aby serwlet działał nieprzerwanie.
97
Odpowiedzi:
Twój problem polega na tym, że nie rozumiesz celu serwletu . Ma działać na żądaniach HTTP, nic więcej. Potrzebujesz tylko zadania w tle, które jest uruchamiane raz dziennie.
EJB jest dostępny? Posługiwać się
@Schedule
Jeśli twoje środowisko obsługuje EJB (tj. Prawdziwy serwer Java EE, taki jak WildFly, JBoss, TomEE, Payara, GlassFish itp.), Użyj
@Schedule
zamiast tego. Oto kilka przykładów:Tak, to naprawdę wszystko. Kontener automatycznie odbierze go i nim zarządza.
EJB niedostępny? Posługiwać się
ScheduledExecutorService
Jeśli twoje środowisko nie obsługuje EJB (tj. Nie używasz nie prawdziwego serwera Java EE, ale serwletów szkieletowych, takich jak Tomcat, Jetty itp.), Użyj
ScheduledExecutorService
. Może to zostać zainicjowane przezServletContextListener
. Oto przykład wstępny:Gdzie zajęcia wyglądają tak:
Nigdy nie myśl o używaniu
java.util.Timer
/java.lang.Thread
w środowisku opartym na Java EE / ServletWreszcie, nigdy nie używaj bezpośrednio
java.util.Timer
i / lubjava.lang.Thread
w Java EE. To recepta na kłopoty. Szczegółowe wyjaśnienie można znaleźć w tej związanej z JSF odpowiedzi na to samo pytanie: Odradzanie wątków w komponencie bean zarządzanym przez JSF dla zaplanowanych zadań przy użyciu timera .źródło
ScheduledExecutorService
: Upewnij się, że przechwyciłeś wszystkie wyjątki w swoim executorze. Jeśli wyjątek ucieka zrun
metody, moduł wykonawczy po cichu przestaje wykonywać. To jest funkcja, a nie błąd. Przeczytaj dokument i naucz się googlować.scheduler.shutdownNow()
nie zostanie poprawnie wywołany, jak na przykładzie. Jeśli to nie zostanie wywołane, wątek harmonogramu będzie rzeczywiście działał.Sugerowałbym użycie biblioteki takiej jak kwarc, aby uruchamiać zadanie w regularnych odstępach czasu. Co tak naprawdę robi serwlet? Wysyła raport?
źródło
Wdrożenie dwie klasy i wywołać
startTask()
wmain
.źródło
Możesz użyć cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php
źródło
W systemie produkcyjnym, który może mieć uruchomionych wiele kontenerów innych niż jee. Użyj innego programu planującego w przedsiębiorstwie, takiego jak harmonogram kwarcowy, który można skonfigurować tak, aby używał bazy danych do zadań maamgememt.
źródło