Java EE Tomcat, Eclipse, podpięcie istniejącego projektu

0

Cześć,
mam istniejący, jak na razie dość prosty projekt w Javie, którego celem jest stworzenia Rest API. Na początku nie zastanawiałem się jakiej technologii użyć do wystawienia pisanych przeze mnie funkcjonalności przez HTTP.

Dopiero teraz kiedy mam już trochę kodu napisanego zacząłem się nad tym zastanawiać. Po krótkich poszukiwaniach padło na JAX-RS + Tomcat. Nie miałem z tym nigdy do czynienia, więc kilka tutoriali i udało mi się uruchomić proste Hello World w przeglądarce.

Ten mój pierwotny projekt działał tak, że miał sobie w funkcję main, która odpowiadała za uruchomienie wszystkich funkcjonalności. Teraz pytanie co zrobić, żeby po uruchomieniu całego projektu na serwerze (Run on Server), zostało uruchomione to, co jest zapisane w funkcji main, tak żebym mógł za pomocą odpowiednich funkcji RESTowych dobrać się do zmiennych, funkcji, które zostały uruchomione w pierwotnek funkcji main.

Tak łopatologicznie, to chodzi mi po prosto o to, żeby wraz z uruchomieniem serwera wystartowało, to co już wcześniej zostało zaprogramowane.

Z góry bardzo dziękuję za pomoc

0
thalion napisał(a):

Teraz pytanie co zrobić, żeby po uruchomieniu całego projektu na serwerze (Run on Server), zostało uruchomione to, co jest zapisane w funkcji main, tak żebym mógł za pomocą odpowiednich funkcji RESTowych dobrać się do zmiennych, funkcji, które zostały uruchomione w pierwotnek funkcji main.

?

A co takiego zostało "zaprogramowane" w tym mainie?

0

Ok, myślałem, że nie ma to znaczenia ale skoro tak to spoko :)

Ogólnie program ma pozwalać zarządzać działaniem różnych urządzeń Smart Home, m.in. żarówkami Philips Hue. To co mam napisane to obsługa właśnie włączania i wyłączania żarówek. Celem całości jest umożliwienie zarządzania różnymi urządzeniami, które z założenia maja różne protokoły komunikacji. Moje API ma być takie samo dla wszystkich urządzeń i przykrywać protokoły poszczególnych producentów. Dzięki temu pisanie końcowej aplikacji klienckiej pozwala abstrahować od protokołu producenta, a więc upraszczać pracę. Teraz jest to jaśniejsze? :)

0

Pisząc API RESTOWE tworzysz tzw endpointy. Nigdy nie robiłem / nie zastanawiałem się dłużej nad takim projektem (smart domu). Nawiązując do tych wspomnianych żarówek, pierwsze co mi przychodzi na myśl to coś w stylu:

  • główny endpoint: urządzenia
  • do konkretnego dostajesz sie po id: urzadzenia/54
  • wykonujesz PUT na: urzadzenia/54/zasilanie np z wartością true, które w dalszej logice "zamieniasz" na użycie odpowiedniej funkcji producenta do włączenia żarówki.

Ale na pewno nie robisz tego wszystkiego w mainie. W "mainie" masz jedynie startowanie Twojej aplikacji.
Reszta dzieje się na podstawie http requestów, które Twoja apka przyjmuje, przetwarza i na które odpowiada.

0

Tak, to się wszystko zgadza. Tylko że do tej pory miałem napisane wykrywanie żarówek (W przyszłości innych urządzeń) I trzymałem ich reprezentacje w obiektach Javy. Mam przygotowany klasy do tego i aplikacja po uruchomieniu wykrywa wszystkie dostępne urządzenia w sieci i pakuje je do jednej listy. I Chcilabym teraz żeby taki endpoint dostawał się do tej listy która została wygenerowana wcześniej - w momencie startu serwera, a nie wtedy kiedy zostanie wysłane żądanie HTTP na serwer.

Innymi słowy, gdzie należy umieścić kod uruchamiany wraz ze startem serwera, a nie wtedy kiedy przyjdzie request. Po to by móc w odpowiedniej chwili dobrać się do wykrytych urządzeń przechowywanych w liście

Tak, jak mówię nigdy z tego nie korzystałem, więc być może moje pytanie jest trywialne. Ale Myślę że teraz już wiadomo o co chodzi:)

0

Nie wiem czy jest to dobry pomysł.
Możesz te reprezentacje urządzeń jako javowe obiekty, trzymać w bazie danych. Następnie wysyłając jakiś request pobierasz jedno konkretne urządzenie z bazy, sprawdzasz czy jest aktualnie dostępne w sieci i następnie wykonujesz sobie to co zechcesz.

Co jeśli włączysz apke, pobrane zostaną urządzenia aktualnie dostępne, apka będzie działać kilka godzin, w ciągu tego czasu odłączysz urządzenie, a użytkownik będzie chciał z niego skorzystać?
W liście "dostępnych urządzeń" będzie widoczne, ale w sieci już go nie będzie.

Oczywiście mój sposób myślenia może być błędny, więc poczekaj na więcej odpowiedzi ;)

0

Rozumiem ale mi tutaj nie chodzi o rozważanie tego pomysłu w sumie, tylko o to gdzie w zasadzie umieścić kod, który zostanie uruchomiony wraz ze startem serwera. Tak żebym mógł się w odpowiednich endpointach dostać np. do zmiennych tam uruchomionych. Jak do tej pory potrafię pisać kod, który wykona się dopiero kiedy wyślę request. Pytanie, co zrobić, żeby napisać kod, który wykona się OD RAZU po uruchomieniu.

Pozdrawiam

0
thalion napisał(a):

Tak żebym mógł się w odpowiednich endpointach dostać np. do zmiennych tam uruchomionych.

Dalej nie rozumiem tego zdania.

Nie wiem jak to jest w samej Javie EE, ale np w spring boot można (lecz nie powinno się) umieścić ten kod w klasie startującej twoją apkę webową - ta z adnotacja @SpringBootApplication.

Tak z ciekawosci, dlaczego wybór padł akurat na taki stack?
Dla początkujących SpringBoot jest bardzo przystępny.

0

Hmm, jeśli chcesz robić aplikację JAX-RS na Tomcacie, to musisz zbudować aplikację webową (artefaktem jest plik .war zamiast .jar), który będzie zawierał plik web.xml o którym możesz poczytać. Ten plik służy do "rejestrowania" takich rzeczy jak servlety i filtry Twojej aplikacji w serwerze. Powinieneś zarejestrować w tym pliku servlet Twojej implementacji JAX-RS (zakładam, że Jersey) oraz przekazać temu servletowi parametr, który określi, które pakiety skanować w poszukiwaniu Twoich REST kontrolerów.

0

Obawiam się, że nie do końca rozumiem. :( Szukałem trochę na podstawie Twojego postu ale ciągle mam mętlik w głowie.

Popraw mnie proszę, jeśli się mylę ale rozumiem, że mam stworzyć z mojego projektu plik war i potem za pomocą web.xml dowiązać go do tomcata. Tylko, czy plikiem war może być kod, który nie ma nic wspólnego z aplikacją webową? Tzn, co ja tak na prawdę mam zrobić z moim do tej pory napisanym kodem, który jest czystą javą i obsługuje komunikację z żarówkami? Czy to on właśnie ma być skompilowany do wara i użyty w servlecie, czy muszę ten kod umieścić najpierw w funkcjach servletowych. Kurde.. nie rozumiem tego :/

EDIT:
Ok, trochę się udało. Po utworzeniu nowego projektu udało mi się sprawić, żeby w konsoli pojawił się Hello World. Trzeba było stworzyć klasę dziedziczącą po HttpServlet, stworzyć w niej metodę init() i dodać w pliku web.xml następujący kod:

  <servlet>
    <servlet-name>ServletName</servlet-name>
    <servlet-class>Paczka.NazaKlasy</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

Następnie ze swojego dotychczasowego projektu stworzyłem plik *.jar i ten plik wykorzystałem w tej klasie która wyświetliła Hello World. I OK, działa. Jest tylko jeden problem. Chciałbym, żeby obiekty, które tworzę były widoczne dla wszystkich endpointów. Innymi słowy, żeby były współdzielone. Czy jest to możliwe? Chcę uruchomić jara i załadować dane do obiektów które będą oczekiwać na zapytania do serwera.

EDIT 2:
No cóż.. sam sobie odpowiadam. Już wiem, więc zostawiam dla innych gdyby ktoś kiedyś szukał podobnych rzeczy.

Do współdzielenia informacji pomiędzy serwerami służy między innymi kontekst servletów.
W startującym servlecie wystarczy napisać

this.getServletConfig().getServletContext().setAttribute("nazwa_atybuty", OBIEKT);

a w tym, w którym chcemy użyć tego obiektu

this.getServletConfig().getServletContext().getAttribute("nazwa_atybuty", OBIEKT);

Dzięki za poświęcony czas :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1