Servlet EJBs in Servlets verwenden?

Diskutiere EJBs in Servlets verwenden? im Web Tier Forum; (Aus irgendeinem Grund werden die Absätze in meinem Beitrag nach dem Posten entfernt...) Guten Abend! Die Frage hört sich einfach an: Ich suche...

  1. darkcode3
    darkcode3 Neues Mitglied
    (Aus irgendeinem Grund werden die Absätze in meinem Beitrag nach dem Posten entfernt...) Guten Abend! Die Frage hört sich einfach an: Ich suche eine Möglichkeit, Stateful Session Beans innerhalb von Servlets zu verwenden. In Servlets lassen sich EJBs scheinbar ganz komfortabel mittels @EJB-Annotation injizieren. Es lassen sich sowohl Stateless als auch Stateful Session Beans injizieren. Jeder HTTP-Zugriff auf das Servlet führt aber zu einem Zugriff auf die selbe Stateful Session Bean, obwohl ich natürlich durch den Einsatz einer Stateful Session Bean bezweckte, dass für jede HTTP-Session separate Stateful Session Beans angelegt werden. Ursache: Servlet-Instanzen sind nicht an einzelne HTTP-Sitzungen gebunden, deshalb bleiben die einmal injizierten EJB-Instanzen dort für immer enthalten. Mit Facelets und BackingBeans sollen sich StatefulBeans wohl sinnvoll nutzen lassen. Da macht man wohl einfach nur ein @Named und @SessionScoped ran und schon geht es. Aber geht das auch mit reinen Servlets? Ich möchte nur ungern alle Nutzdaten mittels HttpSession.setAttribute() abspeichern, und die Nutzdaten dann durch ein verzweigtes Netz an Bean-Aufrufen durchleiten. Weil das ist ja soweit ich weiß gerade der Punkt, warum man dependency injection haben möchte. Google meint auch, man solle einfach die Beans erstellen (mittels new?) und diese dann über HttpSession.setAttribute() festhalten und beim nächsten Aufruf wieder aus dieser Session lesen. Versuche schon den ganzen Tag eine Lösung für das Problem zu finden, habe aber bis jetzt noch nichts zufriedenstellendes gefunden. Bin froh um jeden Tipp oder Kommentar. Danke!
     
    Zuletzt bearbeitet: 7. Juni 2015
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. darkcode3
    darkcode3 Neues Mitglied
    Servlet-Klassen sind zwar gemanaged, sind aber nicht an eine bestimmte HTTP Session gebunden. Laut Stackoverflow kann man angeblich mittels new InitialContext() ein bean laden, indem man ein lookup auf einen jndi pfad in dem folgendem Format ausführt: ejb:///!?stateful Von einem solchen Format für Stateful-Beans konnte ich in der EJB3.1 spezifikation nichts finden, sondern nur java:pfade, die keine distinct-name Angabe ermöglichen. das obige Format hat bei mir nicht funktioniert. Selbst der Lookup auf ein Stateless Bean hat nicht funktioniert:
    Code (Java):
     InitialContext ctx = new InitialContext(); TestBean0Local bean0 = (TestBean0Local)(ctx.lookup("java:module/BeanTest0!mein.package.TestBean0Local"));
    // Schwerwiegend: javax.naming.NamingException: Lookup failed for 'java:module/BeanTest0!mein.package.TestBean0Local' während das Stateless bean aber Problemlos im Servlet funktioniert, wenn man es sich mittels @EJB-Annotation geben lässt. Kennt jemand eine Quelle für die korrekten jndi-Pfade für den Lookup von Stateful-Beans? Hat jemand eine Idee, warum die @EJB-Annotation bei mir funktioniert, nicht aber der Lookup über den InitialContext?
     
  4. BuckRogers
    BuckRogers Mitglied
    Hallo,

    also einige Dinge sind nicht ganz richtig bzw. unklar erläutert. Zum Einen sind alle vom AS verwalteten Javaklassen Servlets. Dazu zählen Managed Beans, Session Beans, MDBeans usw. Diese werden in den ServletContainer gepackt und nach ihrer Konfiguration verwaltet. Stateless Session Bean Instanzen werden in einem gemeinsamen Pool verwaltet und mehrere Clients haben auf die Methoden und Attribute Nacheinander Zugriff. Deswegen sollte man in einer Stateless Bean keine Werte über längere Zeit speichern. Der Vorteil liegt aber in den vielen, kleinen, kurzen Zugriffen von vielen Clients auf wenige Instanzen der Stateless Beans, was die Performance ungemein verbessert.
    Stateful Beans hingegen werden an den Client gebunden, SessionScoped oder RequestScoped... ApplicationScoped ist veraltet. Man kann also in einer Stateful Bean, eine Vielzahl an komplexer und aufwändigher Operationen durchführen, welche abhängig von anderen Beans und Parametern der Anwendung sind. Dafür wird aber die ganze Instanz an den Client gebunden, was den Nachteil hat, dass der Hauptspeicher recht flott dicht werden könnte und der AS die Hufe gibt.
    Injizieren tut man die Beans(Stateless / Stateful ist egal) über @EJB. Der ServletContainer stellt die Bean bereit, indem er eine Instanz erzeugt oder aus einem Pool eine zur Verfügung stehende Instanz bereitstellt. Dieses ganze rumgehacke mit dem ServiceLocator und dem JNDI kann man sich sparen. CDI ist das Stichwort. Ansonsten, wenn du wirklich im ServletContext rumspielen möchtest, dann schlag dochmal nach EJBContext Interface nach. Da gibt es ein paar interessante Dinge glaube ich.

    Viel Spaß noch beim EJB MessUp :p
     
  5. darkcode3
    darkcode3 Neues Mitglied
    Interessante Begriffsklärung. Dann sind WebServlets, Session Beans,... eine Unterkategorie von Servlets?

    Zu CDI muss ich mich noch tiefer einlesen. Aber mein aktueller Stand ist, dass WebServlets Instanzen gepoolt sind und *nicht* an eine bestimmte HTTP-Sitzung gebunden ist. Daher wirkt das @Inject bzw. @EJB in der Servlet instanz lediglich beim ersten HTTP-Request. Danach bleibt die Stateful-Bean für immer injiziert. Und das WebSevlet weiß selbst noch nicht einmal direkt etwas von irgendwelchen HTTP-Sitzungen, die zur Bestimmung des EJB oder CDI SessionScopes herangezogen werden könnte. Völlig ungeachtet dessen, dass WebServlet über request.getSession(true) natürlich eine Session starten könnten.

    Zum EJBContext werde ich mich mal informieren. Danach werde ich einfach nachgeben und JSF verwenden. Da ist meine BackingBean dann einfach SessionScoped und ich kann dann mit @EJB mir weitere Objekte injizieren lassen. Ich werde mal sehen müssen, wieviel Kontrolle ich durch den JSF-Einsatz gegenüber reinen WebServlets abgeben muss...

    Danke dir für deine Anmerkungen!
     
  6. BuckRogers
    BuckRogers Mitglied
    Richtig, gepoolte WebServlets können bei globalen Injizierungen die SessionBean Instanzen an ganz andere Clients weitergeben.
    Deswegen sollte man in WebServlets niemals globale Variablen verwenden, es sei denn sie sind 'final' deklariert.
     
Die Seite wird geladen...

EJBs in Servlets verwenden? - Ähnliche Themen

EJBs und Callbacks (Jboss 7.1)
EJBs und Callbacks (Jboss 7.1) im Forum Allgemeines EE
Aufruf eines EJBs aus einer nativen Java-Applikation
Aufruf eines EJBs aus einer nativen Java-Applikation im Forum Allgemeines EE
Problem mit EJBs und Transaktionen
Problem mit EJBs und Transaktionen im Forum Data Tier
Ersatz für Thread.sleep() in EJBs?
Ersatz für Thread.sleep() in EJBs? im Forum Application Tier
EJBs Kommunikation
EJBs Kommunikation im Forum Allgemeines EE
Thema: EJBs in Servlets verwenden?