Spring MVC mit JBoss vs Tomcat - Vorteile / Praxis
Okay. Dies ist wiederum eine Frage der Praxis.
- Tomcat = Web-Container
- JBoss, WebLogic, etc = Application Servern, Web-Container innerhalb der (für JBoss, seine Gabel Tomcat)
Frühling nicht braucht, Application Server wie JBoss. Wenn wir die enterprise-Dienste wie JMS, etc das wir verwenden können, voneinander unabhängigen Systemen wie RabbitMQ, ApacheMQ, etc.
- Frage ist, warum die Menschen immer noch verwenden, JBoss und anderen Anwendung Dient rein für spring-basierte Anwendungen?
- Was sind die Vorteile, die das Frühjahr nutzen können, durch die Verwendung von Application-Servern? Wie die Objekt-pooling? Welche Vorteile bietet Application Server bietet? Wie sind diese konfiguriert?
- Wenn nicht für das Frühjahr, für welche Zwecke Application Server für Spring/Hibernate, etc stack? (Use-cases)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich würde ich sagen, hören für JMS ist wohl der beste Grund für einen Anwendungsserver. Ein stand-alone-message-broker nicht beheben das problem, da müssen Sie noch eine Komponente, die eingehende Nachrichten warten. Der beste Weg, dies zu tun, ist die Verwendung einer MDB. In der Theorie kann man die Federn verwenden MessageListenerContainer. Aber das hat einige Nachteile wie JMS unterstützt nur blockierende lese-und Feder, daher drehen muß bis es eigene threads, welche überhaupt nicht unterstützt (auch im Tomcat) und können brechen, Transaktionen, security, naming (JNDI) und laden von Klassen (die wiederum brechen kann remoting). Ein JCA resource adapter ist frei zu tun, was es will, einschließlich der dreht threads über WorkManager. Wahrscheinlich wird eine Datenbank verwendet neben JMS (oder ein anderes Ziel), an welcher Stelle Sie müssen XA-Transaktionen und JTA, in anderen Worten, ein application server. Ja, Sie können den patch in diesem servlet-container aber, dass dieser Punkt es wird nicht von einem Anwendungsserver.
IMHO der größte Grund gegen die Anwendung Servern ist, dass es Jahre dauert, nach einem spec veröffentlicht wird (was wiederum Jahre dauert, auch), bis Server implementieren, der Skillung und gebügelt aus der schlimmsten bugs. Nur jetzt, direkt vor EE 7 wird demnächst veröffentlicht tun, die wir haben, sind EE-6-Servern beginnen, zu erscheinen, die nicht völlig gespickt mit bugs. Es wird komisch, bis zu dem Punkt, wo einige Hersteller nicht mehr beheben Fehler in Ihrer EE-6 line, weil Sie bereits beschäftigt mit der kommenden EE-7-Linie.
Bearbeiten
Lange Erklärung des letzten Absatzes:
Java EE in eine Menge von Orten, stützt sich auf den sogenannten Kontextinformationen. Informationen, die nicht explizit als argument übergeben von der server/container, um die Anwendung, sondern implizit "es". Zum Beispiel der aktuelle Benutzer für die Sicherheitskontrolle. Die aktuelle Transaktion oder Verbindung. Die aktuelle Anwendung, um die Klassen zu faul laden von code oder Deserialisieren von Objekten. Oder die aktuelle Komponente (servlet, EJB, ...) für das handeln JNDI-look-ups. Alle diese Informationen werden im thread einheimischen, dass der server/container-sets, bevor Sie eine Komponente (servlet, EJB, ...). Wenn Sie erstellen Sie Ihre eigenen threads dann der server/container nicht über Sie wissen, und alle Funktionen, die sich auf diese Informationen nicht mehr funktionieren. Könnte man mit diesem Weg, indem Sie nur nicht mit jedem dieser Funktionen in threads, die Sie laichen.
Einige links
http://www.oracle.com/technetwork/java/restrictions-142267.html#threads
http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html#spring-4
Wenn wir überprüfen Sie den Servlet-3.0-Spezifikation finden wir:
Dies ist über die asynchrone Verarbeitung aber gelten die gleichen Einschränkungen für benutzerdefinierte threads.
Wieder, asynchrone Verarbeitung, aber gelten die gleichen Einschränkungen für benutzerdefinierte threads.
Nicht tragbar bedeutet, es kann in einem server, aber nicht in einem anderen.
Wenn Sie möchten, empfangen von Nachrichten mit JMS außerhalb einer MDB können Sie mit vier Methoden auf
javax.jms.MessageConsumer
:#receiveNoWait()
können Sie das in einem container-thread nicht blockiert, aber es ist wie spähen. Wenn keine Nachricht vorhanden ist, es gibt einfach zurücknull
. Das ist nicht sehr gut geeignet für das hören von Nachrichten.#receive(long)
können Sie das in einem container-thread blockiert. Sie in der Regel don 'T wan' T zu tun, die Blockierung wartet in einem container-thread. Wieder nicht sehr gut geeignet für das hören von Nachrichten.#receive()
diese Blöcke möglicherweise auf unbestimmte Zeit. Wieder nicht sehr gut geeignet für das hören von Nachrichten.#setMessageListener()
dies ist, was Sie wollen, Sie erhalten einen Rückruf, wenn eine Nachricht eintrifft. Jedoch es sei denn, die Bibliothek kann Haken in den Applikations-server, dies wird nicht ein container-thread. Die Haken in den Applikations-server sind nur über den JCA resource Adapter.Also ja, es kann funktionieren, aber es ist nicht garantiert, und es gibt eine Menge Dinge, die brechen kann.
However this has several disadvantages like JMS only supports blocking reads and Spring therefore needs to spin up it's own threads which is totally unsupported (even in Tomcat) and can break transactions, security, naming (JNDI) and class loading (which in turn can break remoting).
Können Sie mir zeigen, wo Sie dies gefunden? Ich bin sicher, einige Leute benutzen Frühjahr mit unabhängigen message broker ohne App-Server. Versuchen zu finden, wenn jemand brachte dieses problem überall. Nicht sagen, Sie sind falsch! 🙂 Versuchen, um weitere Einblicke zu erhalten.Haben Sie Recht, Sie brauchen nicht wirklich ein true application server (Umsetzung aller Java-EE-specs) zu verwenden Frühling. Der größte Grund, warum Menschen don ' T verwenden Sie true, Java-EE-Applikationen wie JBoss ist, dass wir dann langsam wie #$@#% auf cold-start-up-Zeit, was die Entwicklung einer Schmerz (hot-deploy funktioniert immer noch nicht gut).
Sehen Sie, es gibt zwei Lager:
Eines der Lager glaubt an die spec/Ausschuss-Prozess und die andere glaubt, in wohlwollenden Diktator /Bio-OSS-Prozess. Beide haben die Leute mit Ihrer "Agenda".
Ihre wahrscheinlich nicht gehen, um eine sehr gute unvoreingenommene Antwort als diese zwei Lager sind ähnlich wie Emacs vs VIM Krieg.
Ihre Fragen beantworten w/a Spring bias
(start rant)
Da @PhilippeMarschall verteidigt Java-EE ich werde sagen, dass ich getan haben, die Tomcat+RabbitMQ+Feder route und es funktioniert ganz gut. @PhilippeMarschall Diskussion ist gültig, wenn Sie möchten, eine ordnungsgemäße JTA+JMS, aber mit der richtigen setup mit einem Zweig AMQP und einen einen guten Transaktions-Datenbank wie Postgresql ist das weniger ein Problem. Auch er ist falsch über die message-queue-Transaktionen nicht verbunden/synchronisiert die Plattform Transaktionen, wie der Frühling unterstützt diese (und IMHO viel eleganter mit @Transactional AOP). Auch AMQP ist einfach nur überlegen JMS.
(end of rant)
Sind wir mithilfe von JBoss über tomcat für den JNDI-Datenquellen und Nutzung.. Er macht es so, dass der Programmierer nicht wissen, etwas über die Datenbank, sondern dem JNDI-Namen