# Kommunikation zwischen Servlet und EJB



## JanHH (4. Jan 2011)

Hallo,

habe eine Webanwendung, wo ein simples Servlet auf die gleichen Objekte zugreifen muss wie ein andere Teil der Anwendung, der auf EJBs basiert (Seam 2 / EJB 3.0). Das muss in beide Richtungen funktioneren; sowohl Servlet als auch EJBs müssen lesend und schreibend auf die gleichen Objekte zugreifen. Ein Auslagern der entsprechenden Daten in eine Datenbank ist dabei nicht die optimale Lösung, da performance ziemlich wichtig ist.

Werd jetzt gleich mal ein Buch-Kapitel über JNDI lesen, wie macht man sowas ansonsten? Ist das überhaupt sinnvoll/machbar, und läuft später auch stabil, auch wenn die Anwendung eine relativ hohe Auslastung hat?

Gruß+Danke
Jan


----------



## tagedieb (4. Jan 2011)

Willst du aus dem Servlet direkt auf die Daten zugreifen?

Du hast doch bereits einen Service (EJB) damit kannst du vom Servlet auf die Daten zugreifen. Direkter Zugriff ist ein Designfehler und sollte sich was am 'Service' aendern kannst du die Aenderung gleich zweimal (Servlet und EJB) machen.
Mit dem lokal Interface duerfte es auch keine performance Probleme geben.

Wenn du keine Datenbank verwendest wo speicherst du die Daten denn? Oder arbeitest du nur mit fluechtigen Daten?
Du kannst ueber den Service auch noch einen Caching-Aspekt legen um weiter die Performance zu erhoehen.


----------



## JanHH (4. Jan 2011)

Danke, aber ich glaub Du hast die Frage nicht ganz verstanden. Dass das geht, weiss ich ja. Nur wie? ;-).

Die Anwendung hat sich mittlerweile zu einem Design entwickelt, wo im Application Server diverse Module rumschwirren, die miteinander kommunizieren sollen (ca. 3 oder 4 Stück), ohne dass die Daten dabei in einer Datenbank zwischengelagert werden (aus, wie gesagt, Performancegründen). Also ein Servlet, ein simples Objekt was vor sich hinwerkelt, eine seam/jsf-Webanwendung..

Natürlich wird auch eine Datenbank benutzt. Aber an den besagten Kommunikations-Stellen ist das zu langsam.

Hab mich jetzt aber ein bisschen in JNDI eingelesen und es scheint ja so zu sein, dass man alle relevanten Objekte da im JNDI-Kontext registrieren kann, so können die Objekte jeweils eine Referenz aufeinander bekommen, und ziemlich problemlos miteinander reden.

Oder???

Gruß
Jan


----------



## tagedieb (5. Jan 2011)

Ja, da hab ich die Frage wirklich nicht verstanden.

Die Frage ist wohl: Wie greife ich aus einem Servlet auf ein EJB zu?

Nun, das sollte eigentlich kein Problem sein. Das findest du in jedem J2EE Tutorial.

Die EJBs registrieren sich automatisch in der JNDI Registry, darum musst du dich nicht kuemmern.
Und mit EJB 3 wird auch Clientmaessig der ServiceLookup alles im Hintergrund erledigt.


----------



## JanHH (6. Jan 2011)

ja, so wird das wohl gehen.. zumindest weiss ich jetzt: Ja, es geht. Erstmal gings ja darum, ob das überhaupt geht (Software-Designentscheidung).

Gruß+Danke
Jan


----------



## JanHH (15. Jan 2011)

Also meine bisherigen Erkenntnisse sind eher ernüchternd. Anscheinend wird, wenn man ein Objekt im JNDI-Kontext ablegt und woanders per lookup darauf zugreift, eine KOPIE des Objektes erstellt, und nicht DASSELBE Objekt zurückgegeben, welches man abgelegt hat. Kann das sein? Damit wäre JNDI da vollkommen nutzlos für meine Anwendung. Es geht ja darum, dass ein Servlet und eine EJB eine Referenz auf das selbe Objekt haben. Und wenn das tatsächlich so ist, wie kann man das Problem dann lösen?

Hab das folgendermassen getestet.. ein Objekt mit einer String-Property in jndi abgelegt, an anderer Stelle per lookup geholt, dann den String geändert, und geschaut, ob sich das an beiden Stellen, wo man eine Referenz auf das Objekt hat, synchron verhält.. ist nicht der Fall. Es handelt sich offenbar um zwei verschiedene Objekte.


----------



## JanHH (15. Jan 2011)

Wenn man dann mal auf die Ausgangsfrage zurückgeht.. also Servlet und EJB (oder auch jsf-managed-bean, egal) müssen miteinander reden. Per JNDI geht das offenbar nicht. Wäre JMS dann die richtige Lösung dafür? Das dient ja eigentlich auch schon dem Namen nach dazu, dass verschiedene Teile einer Anwendung miteinander kommunizieren können. Würde das gehen? Eine Queue, in die sowohl Servlet als auch EJB Nachrichten schreiben, und irgendein Listener-Objekt bekommt die alle und kann sie dann synchronisiert abarbeiten? Ich brauche so langsam mal eine vernünftige Lösung für das Problem..


----------

