Ich bin sehr neu in Java EE und versuche, das Konzept der lokalen Schnittstellen und Remote-Schnittstellen zu verstehen.
In den ersten Versionen der EJB-Spezifikation wurden EJBs als Remote-Komponenten "angenommen", und die einzige Möglichkeit, sie aufzurufen, bestand darin, einen Remote-Aufruf unter Verwendung der RMI-Semantik und des damit verbundenen Overheads (Netzwerkaufruf und Objektserialisierung für jeden) durchzuführen Methodenaufruf). EJB-Clients mussten diese Leistungseinbußen auch dann zahlen, wenn sie sich in derselben virtuellen Maschine wie der EJB-Container befanden.
Später stellte Sun fest, dass die meisten Geschäftsanwendungen EJBs tatsächlich nicht auf einer anderen Ebene verteilten, und korrigierte die Spezifikation (in EJB 2.0), indem sie das Konzept lokaler Schnittstellen einführte, sodass Clients, die in derselben virtuellen Maschine mit dem EJB-Container zusammengeschlossen sind, EJBs mithilfe von aufrufen können direkter Methodenaufruf unter vollständiger Umgehung der RMI-Semantik (und des damit verbundenen Overheads).
Mir wurde gesagt, dass einer der großen Vorteile von Java EE darin besteht, dass es einfach zu skalieren ist (was meiner Meinung nach bedeutet, dass Sie verschiedene Komponenten auf verschiedenen Servern bereitstellen können).
Java EE kann skaliert werden, dies bedeutet jedoch nicht unbedingt das Verteilen von Komponenten. Sie können eine Web + EJB-Anwendung in einem Cluster ausführen, ohne die Webschicht und die EJB-Schicht zu trennen.
Sollten Sie Remote-Schnittstellen verwenden, wenn Sie erwarten, dass Ihre Anwendung unterschiedliche Komponenten auf unterschiedlichen Servern enthält? Und lokale Schnittstellen verwenden, wenn sich Ihre Anwendung nur auf einem Server befinden soll?
Ich würde es so formulieren: Verwenden Sie Remote-Schnittstellen, wenn sich der Client nicht in derselben JVM befindet (dies bedeutet nicht, dass nur ein Server / eine JVM verwendet wird).
(...) Verwenden Sie zunächst lokale Schnittstellen und aktualisieren Sie gegebenenfalls schrittweise auf Remote-Schnittstellen.
Ich würde wahrscheinlich mit lokalen Schnittstellen beginnen. Und wie bereits angedeutet, ist das Wechseln zu Remote-Schnittstellen nicht immer obligatorisch (Sie können eine zusammengestellte Struktur gruppieren ).
Ich schlage vor, die unten genannten Ressourcen zu überprüfen (die beiden ersten sind ziemlich alt, aber immer noch relevant, die beiden anderen sind neuer).
Ressourcen
It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?
Ja, genau das ist es.Do you, by chance know of good books on this topic?
Leider, nein, ich kenne die absolute Ressource "ZE" nicht, wenn es eine gibt. Ich habe jedoch weitere Ressourcen mit einigen Referenzen hinzugefügt.Obwohl ich mit den meisten der oben genannten Punkte einverstanden bin, möchte ich die Ideen zum Starten ein wenig verfeinern.
Mein Vorschlag an Sie ist nie zu immer innerhalb des Codes direkt zu EJB - Schnittstellen zu programmieren. Verwenden Sie immer eine reguläre, geschäftsorientierte Schnittstelle, programmieren Sie darauf (dh haben Sie Ihre Code-Aufrufmethoden auf der geschäftsorientierten Schnittstelle) und stellen Sie den EJB-Klebercode als steckbare Implementierung bereit. Ihr Programm sollte sich auf Geschäftslogik konzentrieren und nicht auf Implementierungsdetails wie EJB.
Auf diese Weise können Sie problemlos zwischen Remote- und lokalen Implementierungen wechseln. Wenn Sie einen IoC-Container wie Spring verwenden, können Sie dies nur über die Konfiguration tun.
Ein besonderer Hinweis zum Wechsel von lokal zu fern: Beachten Sie, dass es einige semantische Unterschiede zwischen den beiden gibt. Wenn Sie beispielsweise eine EJB-Methode über ihre "Remote-Schnittstelle" aufrufen, werden Argumente als Wert übergeben, während beim Aufruf über die "lokale Schnittstelle" Argumente als Referenz übergeben werden. Dies ist ein großer Unterschied; Wenn Sie also "mit lokal beginnen", stellen Sie sicher, dass Sie Ihr System so gestalten, dass auch die "entfernte" Semantik berücksichtigt wird.
Wenn Ihr Entwurf auf EJB-Methoden beruht, die übergebene Objekte ändern, ist es für Sie schwierig, später auf "Remote" umzuschalten. vielleicht sogar unmöglich.
Viel Glück.
quelle
Gemäß EJB Spec 3.2 kann ein EJB entweder lokal oder remote sein . Eine Geschäftsschnittstelle kann nicht gleichzeitig lokal und remote sein.
@Local
Auf kommentierte Beans kann nur zugegriffen werden, wenn sie sich in derselben Anwendung befinden.@Remote
Auf kommentierte Beans kann über verschiedene Anwendungen hinweg zugegriffen werden, die sich in verschiedenen JVMS oder über Anwendungsserver befinden.Die wichtigsten Dinge, die Sie beachten sollten, sind:
@Remote
Annotation enthält , müssen alle implementierten Schnittstellen remote sein.@Local
Annotation angegeben ist, wird angenommen, dass alle implementierten Schnittstellen lokal sind.quelle
@Local
eine EJB in einer anderen Anwendung (JAR, WAR, EAR) aufrufen, jedoch in derselben JVM?Dies kann Ihre Bedenken beantworten:
Quelle: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text
quelle