Wpis z mikrobloga

Cześć. Robię sobie właśnie serwer websocket w javie. Używam to tego kontenera Jetty, websocketów JSR-356 (nie tych dostarczanych wraz z Jettym). Mam klasę z adnotacją @ServerEndpoint i wszystko działa elegancko, mogę sobie rozmawiać przez te websockety, ale zastanawia mnie jedna rzecz.

Powiedzmy że przez cały cykl życia aplikacji będę potrzebował instancji jakiejś klasy - w tle będzie sobie działać symulacja, a websocketów będę używał tylko do wysyłania danych wygenerowanych przez tę symulację do przeglądarki. Dodatkowym problemem jest fakt, że Jetty uruchamiam pluginem jetty-maven-plugin, więc stworzenie instancji tej klasy jako singletona w metodzie main też nie wchodzi w grę, bo nie mam metody main.

Jakie jest poprawne podejście jeśli potrzebuje czegoś takiego? Zrobiłem sobie nowy servlet, który uruchamia się wraz z jettym i niby wygląda to spoko, bo mógłbym tam uruchomić symulację, ale czy takie użycie servletów jest poprawne? Bo wydaje mi się że one służą do czegoś innego.

Jeżeli moje podejście jest całkiem złe, to czego użylibyście w takiej sytuacji? Tzn. mam symulację, i chcę wysyłać z niej dane do przeglądarki w regularnych odstępach czasu?

#java #programowanie #backend #naukaprogramowania
  • 5
Po pierwsze nie stosuj mavena żeby uruchomić aplikację, zrób sobie jednojarowy uruchamialny artefakt. Maven powinien zajmować się tylko i wyłącznie budowaniem i weryfikacją jakości artefaktu.
Po drugie z tego co słusznie mówisz servlet api służy raczej do obsługi interakcji po interfejsie webowym, ale też ma w sobie obsługę cyklu życia : https://en.m.wikipedia.org/wiki/Java_servlet
I teraz tak:kiedyś rzeczywiście gdzieś odpalało się serwer aplikacji który zarządzał całością, wtedy można było rozważać to, żeby to on
@futh3r jak nie masz maina (co jest słabym pomysłem) to musisz użyć jakiegoś kontenera IoC, żeby wstrzyknąć instancje odpowiedzialna za wyniki symulacji tam, gdzie obslugujesz web socjety. Inaczej się tego zrobić nie da.
@tptak @Saly

Dziękuję za odpowiedzi Panowie, sporo się wyjaśniło.

Po pierwsze nie stosuj mavena żeby uruchomić aplikację, zrób sobie jednojarowy uruchamialny artefakt. Maven powinien zajmować się tylko i wyłącznie budowaniem i weryfikacją jakości artefaktu.

jak nie masz maina (co jest słabym pomysłem) to musisz użyć jakiegoś kontenera IoC, żeby wstrzyknąć instancje odpowiedzialna za wyniki symulacji tam, gdzie obslugujesz web socjety. Inaczej się tego zrobić nie da.


Mavena używałem bo potrafił sam wykryć
@futh3r: Zamiast metody init() serwletów, do wystartowania tej symulacji możesz skorzystać z tego:
https://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html
i metody contextInitialized. Analogicznie np. w metodzie contextDestroyed mógłbyś sobie zapisywać gdzieś aktualny stan symulacji, żeby móc ją później odtworzyć. Plus jest taki, że to rozwiązanie zadziała Ci w zwykłym kontenerze serwletów typu jetty i nic nowego nie musisz dodawać.
@Eoghan: Dzięki, podoba mi się takie rozwiązanie o wiele bardziej niż wstrzelanie się do init()'a. Na razie zrobiłem dodatkowego maina i wszystko uruchamia się już bez mavena i w tym mainie będę sobie uruchamiał symulację. Ale gdyby się okazało że takie rozwiązanie jest złę z jakiegoś powodu, to będę pamiętał o tym. Szczerze mówiąc zanim zadałem pytanie szukałem czegoś takiego, ale jak widać słabo szukałem bo nie znalazłem ( ͡°