Was ist ein EJB und was macht es?

151

Ich habe versucht zu lernen, was EJBBohnen sind, was bedeutet das, dass ihre Instanzen in einem Pool verwaltet werden, bla bla. Ich kann sie wirklich nicht gut in den Griff bekommen.

Können Sie mir erklären, was sie wirklich sind (praktisch für einen Java-Programmierer)? Was machen Sie? Welches sind ihre Zwecke? Warum sie wirklich benutzen? (Warum nicht einfach bleiben POJO?) Vielleicht eine Beispielanwendung?

Bitte beziehen Sie sich nur auf aktualisierte Informationen EJB 3.1. Datierte Informationen über EJB können irreführend sein.

Für EJB-Anfänger beachten Sie bitte:

EJB basieren auf verteilten Objekten . Dies bezieht sich auf Softwareteile, die auf mehreren Computern (virtuell oder physisch) ausgeführt werden, die über ein Netzwerk verbunden sind .

Jacktrades
quelle

Antworten:

161

Warum sie wirklich benutzen? (Warum nicht einfach bei POJO bleiben?)

Wenn Sie eine Komponente benötigen, die auf die Datenbank zugreift oder auf andere Konnektivitäts- / Verzeichnisressourcen zugreift oder von mehreren Clients aus aufgerufen wird oder als SOA-Dienst gedacht ist, sind EJBs heutzutage normalerweise "größer, stärker, schneller (oder zumindest skalierbarer)". und einfacher "als POJOs. Sie sind am wertvollsten für die Bedienung einer großen Anzahl von Benutzern über das Web oder das Unternehmensnetzwerk und etwas weniger wertvoll für kleine Apps innerhalb einer Abteilung.

  1. Wiederverwenden / Freigeben von Logik für mehrere Anwendungen / Clients mit Loose Coupling.
    EJBs können in ihren eigenen Gläsern verpackt, bereitgestellt und von vielen Stellen aus aufgerufen werden. Sie sind gemeinsame Komponenten. Es stimmt, POJOs können (sorgfältig!) Als Bibliotheken entworfen und als Gläser verpackt werden. EJBs unterstützen jedoch sowohl den lokalen als auch den Remote-Netzwerkzugriff - einschließlich der lokalen Java-Schnittstelle, des transparenten RMI, der asynchronen JMS-Nachricht und des SOAP / REST-Webdiensts.
    Sie sind sehr nützlich zum Erstellen von SOA-Diensten. Bei Verwendung für den lokalen Zugriff handelt es sich um POJOs (mit zusätzlichen kostenlosen Containerdiensten). Das Entwerfen einer separaten EJB-Schicht fördert die besondere Sorgfalt bei der Maximierung der Kapselung, der losen Kopplung und des Zusammenhalts sowie eine saubere Schnittstelle (Fassade), die Anrufer vor komplexen Verarbeitungs- und Datenmodellen schützt.

  2. Skalierbarkeit und Zuverlässigkeit Wenn Sie eine große Anzahl von Anforderungen von verschiedenen aufrufenden Nachrichten / Prozessen / Threads anwenden, werden diese zuerst auf die verfügbaren EJB-Instanzen im Pool verteilt und dann in die Warteschlange gestellt. Dies bedeutet, dass wenn die Anzahl der eingehenden Anforderungen pro Sekunde größer ist, als der Server verarbeiten kann, wir uns ordnungsgemäß verschlechtern - es werden immer einige Anforderungen effizient verarbeitet und die überschüssigen Anforderungen müssen warten. Wir erreichen keine Server-Kernschmelze - bei der ALLE Anforderungen gleichzeitig eine schreckliche Antwortzeit haben und der Server versucht, auf mehr Ressourcen zuzugreifen, als die Hardware und das Betriebssystem verarbeiten können, und daher abstürzt. EJBs können auf einer separaten Ebene bereitgestellt werden, die geclustert werden kann. Dies bietet Zuverlässigkeit durch Failover von einem Server auf einen anderen. Außerdem kann Hardware hinzugefügt werden, um linear zu skalieren.

  3. Parallelitätsverwaltung. Der Container stellt sicher, dass mehrere Clients automatisch sicher (seriell) auf EJB-Instanzen zugreifen. Der Container verwaltet den EJB-Pool, den Thread-Pool und die Aufrufwarteschlange und führt automatisch Schreibsperren auf Methodenebene (Standard) oder Lesesperren (über @Lock (READ)) durch. Dies schützt Daten vor Beschädigung durch gleichzeitige Schreib- / Schreibkonflikte und hilft beim konsistenten Lesen von Daten, indem Lese- / Schreibkonflikte verhindert werden.
    Dies ist hauptsächlich für @ Singleton-Session-Beans nützlich, bei denen die Bean den allgemeinen Status von Client-Anrufern manipuliert und gemeinsam nutzt. Dies kann leicht überschrieben werden, um erweiterte Szenarien für die gleichzeitige Codeausführung und den Datenzugriff manuell zu konfigurieren oder programmgesteuert zu steuern.

  4. Automatisierte Transaktionsabwicklung.
    Tun Sie überhaupt nichts und alle Ihre EJB-Methoden werden in einer JTA-Transaktion ausgeführt. Wenn Sie mit JPA oder JDBC auf eine Datenbank zugreifen, wird diese automatisch in die Transaktion aufgenommen. Gleiches gilt für JMS- und JCA-Aufrufe. Geben Sie @TransactionAttribute (someTransactionMode) vor einer Methode an, um anzugeben, ob / wie diese bestimmte Methode an der JTA-Transaktion teilnimmt, und überschreiben Sie dabei den Standardmodus: "Erforderlich".

  5. Sehr einfacher Ressourcen- / Abhängigkeitszugriff über Injektion.
    Der Container sucht nach Ressourcen und legt Ressourcenreferenzen als Instanzfelder in der EJB fest: z. B. JNDI-gespeicherte JDBC-Verbindungen, JMS-Verbindungen / Themen / Warteschlangen, andere EJBs, JTA-Transaktionen, Persistenzkontexte für JPA-Entitätsmanager, Factory-Persistenz-Einheiten für JPA-Entitätsmanager und JCA-Adapterressourcen. zB um einen Verweis auf eine andere EJB & eine JTA-Transaktion & einen JPA-Entitätsmanager & eine JMS-Verbindungsfactory und -warteschlange einzurichten:

    @Stateless
    public class MyAccountsBean {
    
        @EJB SomeOtherBeanClass someOtherBean;
        @Resource UserTransaction jtaTx;
        @PersistenceContext(unitName="AccountsPU") EntityManager em;
        @Resource QueueConnectionFactory accountsJMSfactory;
        @Resource Queue accountPaymentDestinationQueue;
    
        public List<Account> processAccounts(DepartmentId id) {
            // Use all of above instance variables with no additional setup.
            // They automatically partake in a (server coordinated) JTA transaction
        }
    }
    

    Ein Servlet kann diese Bean lokal aufrufen, indem es einfach eine Instanzvariable deklariert:

    @EJB MyAccountsBean accountsBean;    
    

    und dann einfach seine 'Methoden wie gewünscht aufrufen.

  6. Intelligente Interaktion mit JPA. Standardmäßig verwendet der wie oben injizierte EntityManager einen transaktionsbezogenen Persistenzkontext. Dies ist perfekt für zustandslose Session Beans. Wenn eine (zustandslose) EJB-Methode aufgerufen wird, wird innerhalb der neuen Transaktion ein neuer Persistenzkontext erstellt. Alle in die Datenbank abgerufenen / geschriebenen Entitätsobjektinstanzen sind nur innerhalb dieses Methodenaufrufs sichtbar und von anderen Methoden isoliert. Wenn jedoch andere zustandslose EJBs von der Methode aufgerufen werden, gibt der Container denselben PC weiter und teilt ihn mit ihnen, sodass dieselben Entitäten in derselben Transaktion automatisch auf konsistente Weise über den PC gemeinsam genutzt werden.
    Wenn eine @Stateful-Sitzungs-Bean deklariert wird, wird die gleiche intelligente Affinität zu JPA erreicht, indem der entityManager als erweiterter Bereich deklariert wird: @PersistentContent (unitName = "AccountsPU, type = EXTENDED). Dies gilt für die Lebensdauer der Bean-Sitzung. Über mehrere Bean-Aufrufe und -Transaktionen hinweg werden speicherinterne Kopien von DB-Entitäten zwischengespeichert, die zuvor abgerufen / geschrieben wurden, damit sie nicht erneut abgerufen werden müssen.

  7. Lebenszyklusverwaltung. Der Lebenszyklus von EJBs wird von Containern verwaltet. Bei Bedarf werden EJB-Instanzen erstellt, der Stateful Session Bean-Status gelöscht und initialisiert, Lifecycle-Callback-Methoden passiviert und aktiviert, sodass EJB-Code an Lifecycle-Vorgängen teilnehmen kann, um Ressourcen abzurufen und freizugeben oder ein anderes Initialisierungs- und Herunterfahrverhalten durchzuführen. Außerdem werden alle Ausnahmen erfasst, protokolliert, Transaktionen nach Bedarf zurückgesetzt und nach Bedarf neue EJB-Ausnahmen oder @ApplicationExceptions ausgelöst.

  8. Sicherheitsmanagement. Die rollenbasierte Zugriffssteuerung auf EJBs kann über eine einfache Annotation oder XML-Einstellung konfiguriert werden. Der Server übergibt die authentifizierten Benutzerdetails automatisch zusammen mit jedem Anruf als Sicherheitskontext (aufrufender Principal und Rolle). Es stellt sicher, dass alle RBAC-Regeln automatisch durchgesetzt werden, damit Methoden nicht illegal von der falschen Rolle aufgerufen werden können. Es ermöglicht EJBs den einfachen Zugriff auf Benutzer- / Rollendetails für zusätzliche programmatische Überprüfungen. Es ermöglicht das standardmäßige Einstecken zusätzlicher Sicherheitsverarbeitung (oder sogar IAM-Tools) in den Container.

  9. Standardisierung & Portabilität. EJB-Implementierungen entsprechen den Java EE-Standards und Codierungskonventionen und fördern die Qualität sowie das Verständnis und die Wartung. Es fördert auch die Portabilität von Code auf neue Anbieter-App-Server, indem sichergestellt wird, dass alle dieselben Standardfunktionen und -verhalten unterstützen, und indem Entwickler davon abgehalten werden, versehentlich proprietäre
    nicht portable Anbieterfunktionen zu übernehmen.

  10. Der wahre Kicker: Einfachheit. All dies kann mit sehr optimiertem Code ausgeführt werden - entweder mithilfe der Standardeinstellungen für EJBs in Java EE 6 oder durch Hinzufügen einiger Anmerkungen. Coding Unternehmen / Industrie Stärke Funktionen in Ihrem eigenen POJOs wäre Art und Weise mehr volumous, komplex und fehleranfällig. Sobald Sie mit dem Codieren mit EJBs beginnen, sind diese recht einfach zu entwickeln und bieten eine Reihe von Vorteilen für "Freeride".

In der ursprünglichen EJB-Spezifikation von vor 10 Jahren waren EJBs ein großes Produktivitätsproblem. Sie waren aufgebläht, benötigten viele Code- und Konfigurationsartefakte und boten etwa 2/3 der oben genannten Vorteile. Die meisten Webprojekte haben sie nicht verwendet. Dies hat sich jedoch durch 10 Jahre Optimierung, Überarbeitung, Funktionsverbesserung und Optimierung der Entwicklung erheblich geändert. In Java EE 6 bieten sie maximale industrielle Stärke und einfache Bedienung.

Was ist nicht zu mögen? :-) :-)

Glen Best
quelle
67

Ein EJB ist eine Java-Komponente, die Geschäftslogik enthält, die Sie in einem Container bereitstellen und die dank Anmerkungen in der Regel deklarativ von den vom Container bereitgestellten technischen Diensten profitiert:

  • Transaktionsverwaltung: Eine Transaktion kann automatisch gestartet werden, bevor eine Methode des EJB aufgerufen wird, und festgeschrieben oder zurückgesetzt werden, sobald diese Methode zurückgegeben wird. Dieser Transaktionskontext wird an Aufrufe an andere EJBs weitergegeben.
  • Sicherheitsmanagement: Es kann überprüft werden, ob der Aufrufer über die erforderlichen Rollen verfügt, um die Methode auszuführen.
  • Abhängigkeitsinjektion: Andere EJBs oder Ressourcen wie ein JPA-Entitätsmanager, eine JDBC-Datenquelle usw. können in die EJB injiziert werden.
  • Parallelität: Der Container stellt sicher, dass jeweils nur ein Thread eine Methode Ihrer EJB-Instanz aufruft.
  • Verteilung: Einige EJBs können von einer anderen JVM aus remote aufgerufen werden.
  • Failover und Lastausgleich: Remote-Clients Ihrer EJBs können ihren Anruf bei Bedarf automatisch auf einen anderen Server umleiten lassen.
  • Ressourcenverwaltung: Stateful Beans können automatisch auf die Festplatte passiviert werden, um den Speicherverbrauch Ihres Servers zu begrenzen.
  • ... Ich habe wahrscheinlich einige Punkte vergessen.
JB Nizet
quelle
Wenn Sie sich auf eine Transaktion beziehen - beziehen Sie sich auf die Beständigkeit?
Jacktrades
6
Ja, aber nicht nur. EJB-Container bieten einen verteilten JTA-Transaktionsmanager, der mehrere Ressourcen in einer einzigen Transaktion unterstützt. Sie können beispielsweise einige Daten in einer Datenbank aktualisieren und einige JMS-Nachrichten in einer einzigen Transaktion senden. Wenn etwas fehlschlägt, wird alles zurückgesetzt: die DB-Updates und die gesendeten Nachrichten.
JB Nizet
@JBNizet entschuldigen Sie, dass ich einen alten Thread kommentiert habe, aber NICHT EJB-Frameworks wie Spring bieten diese von Ihnen erwähnten Dienste an. Ich verstehe den Unterschied nicht
MoienGK
Die Grundprinzipien sind die gleichen. Der Frühling nahm Ideen von EJBs und umgekehrt. Die API, die Implementierung, die Art der Bereitstellung und einige Funktionen sind jedoch unterschiedlich.
JB Nizet
@JB Nizet Wo würden Sie im MVC-Muster EJBs im Allgemeinen platzieren? Ich würde sagen, sie gehören zur Modellschicht, obwohl ich viele Leute kenne, die sagen, dass sie Controller sind. Wenn EJB Geschäftslogik enthält (Sie sagten, dass dies der Fall ist), handelt es sich per Definition um eine Modellschicht.
user107986
22

Ich hoffe, dass dies von Oracle Doc jemandem wie mir hilft, das Thema EJB auf einfache Weise zu verstehen.

Was ist eine Enterprise Bean? In der Programmiersprache Java geschrieben, ist eine Enterprise-Bean eine serverseitige Komponente, die die Geschäftslogik einer Anwendung kapselt. Die Geschäftslogik ist der Code, der den Zweck der Anwendung erfüllt. In einer Bestandskontrollanwendung implementieren die Enterprise-Beans beispielsweise die Geschäftslogik in Methoden namens checkInventoryLevel und orderProduct. Durch Aufrufen dieser Methoden können Clients auf die von der Anwendung bereitgestellten Inventarservices zugreifen.

Vorteile von Enterprise Beans Aus mehreren Gründen vereinfachen Enterprise Beans die Entwicklung großer, verteilter Anwendungen. Erstens kann sich der Bean-Entwickler auf die Lösung von Geschäftsproblemen konzentrieren, da der EJB-Container Enterprise-Beans Dienste auf Systemebene bereitstellt. Der EJB-Container ist anstelle des Bean-Entwicklers für Dienste auf Systemebene wie Transaktionsmanagement und Sicherheitsautorisierung verantwortlich.

Zweitens kann sich der Cliententwickler auf die Präsentation des Clients konzentrieren, da die Beans anstelle der Clients die Geschäftslogik der Anwendung enthalten. Der Client-Entwickler muss die Routinen, die Geschäftsregeln implementieren oder auf Datenbanken zugreifen, nicht codieren. Infolgedessen sind die Clients dünner, ein Vorteil, der besonders für Clients wichtig ist, die auf kleinen Geräten ausgeführt werden.

Drittens kann der Application Assembler, da Enterprise-Beans tragbare Komponenten sind, neue Anwendungen aus vorhandenen Beans erstellen. Diese Anwendungen können auf jedem kompatiblen Java EE-Server ausgeführt werden, sofern sie die Standard-APIs verwenden.

Verwendung von Enterprise Beans Sie sollten die Verwendung von Enterprise Beans in Betracht ziehen, wenn Ihre Anwendung eine der folgenden Anforderungen erfüllt:

Die Anwendung muss skalierbar sein. Um eine wachsende Anzahl von Benutzern aufzunehmen, müssen Sie möglicherweise die Komponenten einer Anwendung auf mehrere Computer verteilen. Die Enterprise-Beans einer Anwendung können nicht nur auf verschiedenen Computern ausgeführt werden, sondern ihr Standort bleibt auch für die Clients transparent.

Transaktionen müssen die Datenintegrität sicherstellen. Enterprise Beans unterstützen Transaktionen, die Mechanismen, die den gleichzeitigen Zugriff auf freigegebene Objekte verwalten.

Die Anwendung wird eine Vielzahl von Clients haben. Mit nur wenigen Codezeilen können Remoteclients Enterprise-Beans leicht finden. Diese Kunden können dünn, vielfältig und zahlreich sein.

Tesfa Zelalem
quelle
3

Die Frage, die mich am meisten interessiert, ist, wie und wo ich sie verwenden kann. Um dies zu verstehen, müssen wir zuerst sehen, welche Arten von EJBs existieren. Es gibt 2 große Kategorien:

  1. Session Beans
  2. Nachrichtengesteuerte Bohnen

Betrachten wir Session Beans. Sie sind von 3 Arten:

  1. Stateful - Diese Komponenten behalten den Status bei und sind für einen Client über mehrere Anforderungen hinweg spezifisch. Sehen Sie es als Sitzung. Die unmittelbare Verwendung, für die diese verwendet werden könnten, sind Einkaufswagen oder andere Arten von Sitzungen (Anmeldesitzung usw.).
  2. Statuslos - Dies sind eigenständige Komponenten, die Informationen zwischen Anforderungen nicht beibehalten, aber für den Benutzer eindeutig sind. Sofortige Verwendung, die mir in den Sinn kommt - Serviceklassen in der Service-Schicht . Stellen Sie sich vor OrderService. Eine weitere große Verwendung für diese ist die Bereitstellung von Webdiensten. Auch dies kann in der Service-Schicht oder völlig getrennt sein.
  3. Singleton - Dies sind die Beans, die pro Anwendung vorhanden sind und einmal erstellt wurden und auf die mehrmals wiederverwendet werden kann. Sofort Configurationfällt Ihnen die Komponente ein - hier können Sie Konfigurationen auf Anwendungsebene speichern und von überall auf sie zugreifen, wenn Sie sie benötigen.

Jetzt können die restlichen Funktionen oder Features in solchen Situationen schichtübergreifend verwendet werden:

  • Sicherheit - Sie können mit einer Anmerkung zur aufgerufenen Methode nach Berechtigungen suchen. Dies kann sowohl in der Service-Schicht als auch in der Steuerung geschehen, wenn Sie dies wünschen.
  • Transaktionsmanagement - Dies ist der offensichtliche Kandidat in der Service- oder Persistenzschicht
  • Abhängigkeitsinjektion - wird wieder überall verwendet

Eine große Verwendung in der heutigen Zeit sind die sogenannten Microservices und serviceorientierten Architekturen. Sie können einige Geschäftslogikkomponenten als EJBs verpacken und im gesamten Unternehmen verteilen, um sie von mehreren Clients zu verwenden (mit Client meine ich hier andere Back-End-Anwendungen).

Und so weiter. Der große Nachteil ist nun, dass Sie sehr abhängig vom EJB-Container werden und obwohl Sie zwischen zwei Referenzimplementierungen wechseln können, können Sie nicht zu etwas Leichterem wechseln - zum Beispiel zu Tomcat. Aber warum sollten Sie alle Vorteile opfern wollen?

ACV
quelle