2013-03-07 17 views
13

OK. To znowu kwestia praktyki branżowej.Spring MVC z JBoss vs Tomcat - Zalety/praktyka

  • Tomcat = Web Container
  • JBoss, WebLogic, etc = Serwery aplikacji sieci Web, które mają wewnątrz kontenera (dla JBoss, Tomcat) jego odłam

Wiosna nie potrzebuje jak JBoss Application Server. Jeśli używamy usługi przedsiębiorstwa jak JMS, itp możemy skorzystać z niezależnych systemów jak RabbitMQ, ApacheMQ itp

  1. pytanie jest dlaczego ludzie nadal korzystać z JBoss i inne Zastosowanie Służy do aplikacji opartych wyłącznie wiosna?
  2. Jakie zalety Spring może wykorzystać przy użyciu serwerów aplikacji? Jak łączenie obiektów? Jakie szczególne zalety oferuje serwer aplikacji? Jak są skonfigurowane?
  3. Jeśli nie na wiosnę, do jakich innych zastosowań są używane serwery aplikacji Spring/Hibernate, etc stack? (Przypadki użycia)

Odpowiedz

6

Właściwie powiedziałbym, że odsłuchiwanie JMS jest prawdopodobnie najlepszym powodem dla serwera aplikacji. Autonomiczny broker komunikatów nie naprawia problemu, ponieważ wciąż potrzebujesz komponentu, który nasłuchuje wiadomości. Najlepszym sposobem na to jest użycie MDB. Teoretycznie możesz użyć Springs MessageListenerContainer. Ma to jednak kilka wad, takich jak JMS, który obsługuje tylko blokowanie odczytów, dlatego też Spring musi rozpoczynać własne wątki, które jest całkowicie nieobsługiwane (nawet w Tomcata) i może przerwać transakcje, bezpieczeństwo, nazewnictwo (JNDI) i ładowanie klasy (co z kolei może się zepsuć remoting). Adapter zasobów JCA może wykonywać dowolne czynności, w tym wirowanie wątków za pośrednictwem WorkManager. Prawdopodobnie baza danych jest używana poza JMS (lub innym miejscem docelowym), w którym to momencie potrzebne są transakcje XA i JTA, czyli serwer aplikacji. Tak, możesz załączyć to do kontenera serwletów, ale w tym punkcie staje się on nie do odróżnienia od serwera aplikacji.

IMHO największym powodem przeciwko serwerom aplikacji jest to, że zajmuje lata po opublikowaniu specyfikacji (co z kolei trwa również lata), dopóki severs nie wdroży specyfikacji i wyeliminuje najgorsze błędy. Dopiero teraz, tuż przed publikacją EE 7, mamy do czynienia z serwerami EE 6, które nie są całkowicie przepełnione błędami. Staje się to komiczne do punktu, w którym niektórzy dostawcy nie naprawiają błędów w linii EE 6, ponieważ są już zajęci nadchodzącą linią EE 7.

Edit

Długie wyjaśnienie ostatniego akapitu:

Java EE w wielu miejscach powołuje się na to, co się nazywa informacje kontekstowe. Informacje, które nie są jawnie przekazywane jako argumenty z serwera/kontenera do aplikacji, ale niejawnie "tam". Na przykład bieżący użytkownik do kontroli bezpieczeństwa. Bieżąca transakcja lub połączenie. Obecna aplikacja do wyszukiwania klas, aby leniwie załadować kod lub deserializować obiekty. Lub bieżący komponent (serwlet, EJB, ...) do wykonywania wyszukiwań JNDI. Wszystkie te informacje znajdują się w lokalnych wątkach, które serwer/kontener ustawia przed wywołaniem komponentu (serwlet, EJB, ...). Jeśli utworzysz własne wątki, serwer/kontener nie będzie o nich wiedział, a wszystkie funkcje polegające na tych informacjach przestaną działać. Możesz tego uniknąć, po prostu nie używając żadnej z tych funkcji w wątkach, które spawnujesz.

Niektóre linki

http://www.oracle.com/technetwork/java/restrictions-142267.html#threads http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html#spring-4

Jeśli sprawdzamy specyfikacji Servlet 3.0 znajdziemy:

2.3.3.3 asynchroniczne przetwarzanie

Java Enterprise Edition, takie jak sekcja 15.2 .2, "Środowisko aplikacji internetowych" na stronie 15-174 i rozdział 15.3.1, "Propagowanie Secu Tożsamość rity w wywołaniach EJBTM "na stronie 15-176 są dostępne tylko dla wątków wykonujących początkowe żądanie lub gdy żądanie jest wysyłane do kontenera za pomocą metody AsyncContext.dispatch. Funkcje Java Enterprise Edition mogą być dostępne dla innych wątków działających bezpośrednio na obiekcie odpowiedzi za pomocą metody AsyncContext.start (Runnable).

Chodzi o asynchronicznego przetwarzania, ale te same ograniczenia dotyczą niestandardowych wątków.

publiczny początek nieważności (Runnable r) - ta metoda powoduje, że kontener wywołuje wątek, prawdopodobnie z zarządzanej puli wątków, aby uruchomić określony runnable. Kontener może propagować odpowiednie informacje kontekstowe do Runnable.

Ponownie, przetwarzanie asynchroniczne, ale te same ograniczenia dotyczą niestandardowych wątków. Zastosowanie Środowisko

15.2.2 Web

Ten rodzaj kontenera serwletów powinny wspierać ten problem, gdy wykonywane na wątków utworzonych przez autora, ale obecnie nie są do tego zobowiązane. Taki wymóg zostanie dodany w następnej wersji tej specyfikacji. Programiści ostrzegają, że w zależności od tej możliwości wątków tworzonych przez aplikacje nie jest zalecane, ponieważ nie są przenośne.

Nie przenośny oznacza, że ​​może na jednym serwerze, ale nie w innym.

Gdy chcesz otrzymują wiadomości z JMS poza MDB można użyć cztery metody na javax.jms.MessageConsumer:

  • #receiveNoWait() co możliwe, aby ten w wątku pojemnika, nie blokuje, ale to jak wystającym . Jeśli nie ma komunikatu, po prostu zwraca null. To nie jest zbyt dobrze dostosowane do słuchania wiadomości.
  • #receive(long) można to zrobić w wątku kontenera, blokuje się. Zazwyczaj nie należy wykonywać blokowania w wątku kontenera. Znowu niezbyt dobrze nadaje się do słuchania wiadomości.
  • #receive(), blokuje to prawdopodobnie w nieskończoność. Znowu niezbyt dobrze nadaje się do słuchania wiadomości.
  • #setMessageListener() to jest to, co chcesz, twój oddzwani, gdy nadejdzie wiadomość. Jednak chyba, że ​​biblioteka może podłączyć się do serwera aplikacji, nie będzie to wątek kontenera. Haki do serwera aplikacji są dostępne tylko przez JCA dla adapterów zasobów.

Tak, może zadziałać, ale nie jest gwarantowane i istnieje wiele rzeczy, które mogą się zepsuć.

+2

'to jednak ma kilka wad jak JMS obsługuje tylko blokowanie czyta i dlatego Wiosna musi kręcić się swoje własne wątki, które jest całkowicie nieobsługiwane (nawet w Tomcat) i może złamać transakcji, bezpieczeństwo, nazywanie (JNDI) i ładowanie klasy (co z kolei może przerwać zdalne uruchamianie). "Czy możesz mi pokazać, gdzie to znalazłeś? Jestem pewien, że niektórzy ludzie używają Spring z niezależnym brokerem wiadomości bez App Server. Próbuję znaleźć, czy ktoś poruszył ten problem w dowolnym miejscu. Nie mówię, że się mylicie! :-) Próbuje uzyskać lepszy wgląd. –

0

Jesteśmy przy użyciu JBoss nad Tomcat dla źródeł danych JNDI i łączenie .. To sprawia, że ​​tak programista nie musi nic wiedzieć na temat bazy danych, ale jego nazwa JNDI

2

masz rację, że don” t naprawdę potrzebny jest prawdziwy serwer aplikacji (implementujący wszystkie specyfikacje Java EE) do korzystania ze Springa. Największym powodem, dla którego ludzie nie używają prawdziwych aplikacji Java EE, takich jak JBoss, jest to, że powolny był czas # $ @ #% przy zimnym starcie, sprawiając, że rozwój jest uciążliwy (gorąca instalacja nadal nie działa tak dobrze).

Widzisz istnieją dwa obozy:

  • Java EE
  • Spring Framework.

Jeden z obozów wierzy w proces specyfikacji/komitetu, a drugi wierzy w dobroczynny proces dyktatora/organicznego OSS. Obaj mają ludzi z ich "agendami".

Prawdopodobnie nie dostaniesz bardzo dobrej, bezstronnej odpowiedzi, ponieważ te two camps are much like the Emacs vs VIM war.

odpowiedzieć na Twoje pytania w/Spring uprzedzeń

  1. Ponieważ teoretycznie kupuje mniej sprzedawca lock-in (choć znalazłem to być odwrotnie).
  2. Największą zaletą Spring jest AspectJ AOP. O wiele.
  3. Chyba widzę odpowiedź Philippe'a.

(początek rant)

Od @PhilippeMarschall bronił Java EE powiem, że mam zrobić z Tomcat + RabbitMQ + sprężyna trasy i działa całkiem dobrze. @PhilippeMarschall dyskusja jest ważna, jeśli chcesz prawidłowego JTA + JMS, ale przy odpowiedniej konfiguracji z Sprig AMQP i dobrej bazy danych transakcyjnych, takich jak Postgresql, jest to mniejszy problem. Ponadto jest on niepoprawny, jeśli transakcje kolejki komunikatów nie są powiązane/zsynchronizowane z transakcjami platformy, ponieważ Spring obsługuje to (i IMHO znacznie bardziej elegancko z @ Transactional AOP). Również AMQP jest po prostu lepszy od JMS.

(koniec rant)

+0

> ludzie nie używają prawdziwych aplikacji Java EE takich jak JBoss, to wtedy były powolne jak # $ @ #% przy zimnym starcie - Na moim 3 letnim i7: "JBoss EAP 6.0.1.GA (AS 7.1.3. Final-redhat-4) rozpoczął się w 1845ms - Rozpoczął 136 z 217 usług (80 usług jest pasywnych lub na żądanie) " –

+0

Wiem, że JBoss poprawił swoją prędkość, ponieważ tradycyjnie był to bóg okropnie powolny. Muszę pobrać nieprawidłowy JBoss AS, ponieważ podwaja czas uruchamiania mojej aplikacji Spring MVC. –

+4

Tak, po prostu spróbowałem ponownie. JBoss 6.1.0 Alpha vs Tomcat 7.Tak, JBoss uruchamia się szybciej bez aplikacji webowej, ale jest prawie dwa razy wolniejszy niż Tomcat7 po wdrożeniu aplikacji webowej Spring MVC. –