wake-up-neo.com

EJBs - Wann werden Remote- und / oder lokale Schnittstellen verwendet?

Ich bin sehr neu in Java EE und versuche, das Konzept von lokalen Schnittstellen und Remote-Schnittstellen zu verstehen. 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). Kommen dort Remote- und lokale Schnittstellen ins Spiel? Sollen Sie Remote-Schnittstellen verwenden, wenn Sie erwarten, dass Ihre Anwendung unterschiedliche Komponenten auf unterschiedlichen Servern enthält? Und verwenden Sie lokale Schnittstellen, wenn sich Ihre Anwendung nur auf einem Server befindet?

Wenn meine obigen Annahmen zutreffen, wie würden Sie entscheiden, ob Sie lokale oder Remote-Schnittstellen für eine neue Anwendung verwenden, wenn Sie sich nicht sicher sind, wie hoch das Verkehrsaufkommen sein wird? Beginnen Sie mit der Verwendung lokaler Schnittstellen und führen Sie ggf. schrittweise ein Upgrade auf Remote-Schnittstellen durch.

Vielen Dank für jede Klarstellung und Anregungen.

177
Brian DiCasa

Ich bin sehr neu in Java EE und ich versuche, das Konzept der lokalen Schnittstellen und Remote-Schnittstellen zu verstehen.

In den ersten Versionen der EJB - Spezifikation wurde davon ausgegangen, dass EJBs ferne Komponenten waren. Der einzige Weg, sie aufzurufen, bestand darin, einen fernen Aufruf unter Verwendung der RMI - Semantik und des gesamten damit verbundenen Overheads durchzuführen (ein Netzwerkaufruf und eine Objektserialisierung für alle Methodenaufruf). EJB-Clients mussten diese Leistungseinbußen selbst dann zahlen, wenn sie in derselben virtuellen Maschine mit dem EJB-Container zusammengestellt waren.

Später stellte Sun fest, dass die meisten Geschäftsanwendungen keine EJBs auf einer anderen Ebene verteilten, und korrigierte die Spezifikation (in EJB 2.0), indem das Konzept der lokalen Schnittstellen eingeführt wurde, sodass Clients, die in derselben virtuellen Maschine mit dem EJB-Container zusammengefasst 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 Verteilen Komponenten. Sie können eine Web + EJB-Anwendung in einem Cluster ausführen, ohne die Webschicht von der EJB-Schicht zu trennen.

Sollen Sie Remote-Schnittstellen verwenden, wenn Sie erwarten, dass Ihre Anwendung unterschiedliche Komponenten auf unterschiedlichen Servern hat? Und verwenden Sie lokale Schnittstellen, wenn sich Ihre Anwendung nur auf einem Server befindet?

Ich würde es so formulieren: Verwenden Sie Remote-Schnittstellen, wenn sich die Clients nicht in derselben JVM befinden (dies bedeutet nicht, dass Sie nur einen Server/eine JVM verwenden).

(...) Beginnen Sie mit der Verwendung lokaler Schnittstellen und führen Sie gegebenenfalls schrittweise ein Upgrade auf Remote-Schnittstellen durch?

Ich würde wahrscheinlich mit lokalen Schnittstellen beginnen. Und wie bereits angedeutet, ist der Wechsel zu Remote-Schnittstellen nicht immer obligatorisch (Sie können eine collocated -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

179
Pascal Thivent

Obwohl ich mit den meisten der oben genannten Aussagen einverstanden bin, möchte ich die "Wie fange ich an" -Ideen ein wenig verfeinern.

Mein Vorschlag an Sie ist, niemals jemals direkt mit EJB-Schnittstellen in Ihrem Code zu programmieren. Verwenden Sie immer eine reguläre, geschäftsorientierte Schnittstelle, programmieren Sie diese (dh weisen Sie Ihre Codeaufrufmethoden der geschäftsorientierten Schnittstelle zu) und stellen Sie den EJB-Code "glue" als steckbare Implementierung bereit. Ihr Programm sollte sich auf die 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 remote: Beachten Sie, dass es einige semantische Unterschiede zwischen den beiden gibt. Beispielsweise führt der Aufruf einer EJB-Methode über ihre "Remote-Schnittstelle" dazu, dass Argumente als Wert übergeben werden, während der Aufruf über die "lokale Schnittstelle" dazu führt, dass Argumente als Verweis übergeben werden. Dies ist ein Haupt Unterschied; Wenn Sie also mit "lokal" beginnen, stellen Sie sicher, dass Sie Ihr System so entwerfen, dass auch die "entfernte" Semantik berücksichtigt wird.

Wenn Ihr Design sich auf EJB-Methoden stützt, die übergebene Objekte ändern, ist es für Sie schwierig, später auf Remote zu wechseln. vielleicht sogar unmöglich.

Viel Glück.

47
Isaac

Gemäß EJB-Spezifikation 3.2 kann ein EJB entweder local oder remote sein. Eine Geschäftsschnittstelle kann nicht gleichzeitig lokal und remote sein.

Auf mit @Local Versehene Beans kann nur zugegriffen werden, wenn sie sich in derselben Anwendung befinden.

Auf mit @Remote Versehene Beans kann über verschiedene Anwendungen hinweg zugegriffen werden, die sich in verschiedenen JVMS oder über Anwendungsserver hinweg befinden.

Die wichtigsten Dinge, die Sie beachten sollten, sind:

  1. Wenn eine Bean-Klasse die Annotation @Remote Enthält, müssen alle implementierten Schnittstellen remote sein.
  2. Wenn eine Bean-Klasse keine Annotation enthält oder die Annotation @Local Angegeben ist, werden alle implementierten Interfaces als lokal angenommen.
  3. Alle Schnittstellen, die explizit für eine Bean definiert sind, die keine Schnittstelle enthält, müssen als @Local deklariert werden.
  4. Die Version EJB 3.2 neigt dazu, in Situationen, in denen lokale und entfernte Schnittstellen explizit definiert werden müssen, eine genauere Granularität zu bieten.
15
Pritam Banerjee

Dies kann Ihre Bedenken beantworten:

Im Allgemeinen benötigt Ihre Enterprise Java Bean eine Remote-Client-Ansicht, wenn Sie die Bean in verteilten Umgebungen verwenden möchten. Dies ist insbesondere der Fall, wenn der Client, der mit ihr arbeitet, dies tun wird befinden sich in einer anderen Java Virtual Machine (JVM). Bei einer Remote-Client-Ansicht wird der Aufruf einer Methode von der Remote-Home-Schnittstelle und/oder der Remote-Komponenten-Schnittstelle über einen Remote-Methodenaufruf behandelt (RMI).

Eine EJB kann die lokale Client-Ansicht nur verwenden, wenn wirklich gewährleistet ist, dass andere Enterprise-Beans oder Clients die Bean nur innerhalb einer einzelnen JVM adressieren. In diesem Fall erfolgt der Zugriff mit direkten Methodenaufrufen anstelle von RMI.

Quelle: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text

7
Abdulaziz