Verwenden von Stateful-Session-Beans mit Servlets

8

Ich probiere meine ersten EJBs mit Glassfish Server (Ein einfacher Einkaufswagen). Ich beabsichtigte, die CartBean für jede HTTP-Sitzung zu verwenden. Wenn meine Warenkorb-Bean folgt -

%Vor%

Ich muss die obige statusbehaftete Session-Bean in einem Web-Servlet-Client verwenden, Für jede neue HTTP-Sitzung erhalten wir eine neue Stateful-Session-Bean. Damit gibt es einen Einkaufswagen für einen Benutzer. Ist mein Verständnis falsch, Session-Beans in Servlet zu verwenden oder der folgende Code falsch ist, wird dadurch eine Stateful-Session-Bean für alle Benutzer erstellt.

%Vor%     
user2531191 13.11.2013, 05:51
quelle

2 Antworten

16

Das http-Servlet wird von allen Clients dieses Servlets gemeinsam verwendet, sodass das Injizieren einer statusbehafteten Session-Bean nicht korrekt ist und unerwünschte Auswirkungen hat. Session-Beans sollen pro Client verwendet werden und werden normalerweise in der http-Sitzung gespeichert, sodass alle Anforderungen für diese Sitzung Zugriff auf die Session-Bean haben können. Sie müssen jndi lookup in der Methode doGet verwenden und diese Referenz in der http-Sitzung speichern. Einmal gespeichert, müssten Sie von der http-Sitzung abrufen und diese verwenden.

Weitere Informationen

Sie bekommen es ein bisschen falsch. Stateful-Session-Bean-Klasse repräsentiert, wie Sie Ihre Stateful-Daten modellieren, die ein Diagramm von feinkörnigen verwandten Klassen sein könnte. Sie fragen nach einer stichhaltigen Bohne aus dem Behälter (was erstellt / verwaltet / aktiviert / passiviert es). Diese Dienste verwenden wir Stateful Session Bean für. Container weiß jedoch nicht, dass das Objekt, das es übergibt, zu welchem ​​Client gehört. Dann kommt die http-Sitzung ins Bild. Dieser Teil wird nicht so sehr hervorgehoben wie es sein sollte, daher Ihre Verwirrung. Http Session ist ein perfekter Speicherort, wo alle Anfragen von demselben Webclient Zugriff auf alle Attribute haben, die in der HTTP-Sitzung gespeichert sind. Sie fragen also nach dem Container und halten ihn an einem Ort (http-Sitzung), von wo aus er erneut von allen Anfragen für dieselbe Sitzung weitergeleitet werden kann. Stellen Sie sich nun den Fall von Nicht-Web-Clients vor. Dort haben Sie keine http-Sitzung oder einen ähnlichen Mechanismus. Sie müssen einen eigenen Speichermechanismus erstellen, um verschiedene Clients mit ihren jeweiligen Stateful-Beans zu identifizieren. Ein möglicher Weg könnte sein, den Stateful-Bean-Verweis irgendwo zu speichern (etwa in einer Map mit Schlüssel als clientId und Wert als Bean-Referenz), und Wenn der Client das nächste Mal auf die Bean zugreifen möchte, übergibt er die clientId und ruft sie von der Map ab.

Was die Präferenz für http-Session über Stateful Bean betrifft, ist es wichtig zu verstehen, dass http-Session nicht Thread-sicher ist. Wenn Sie also eine Ajax-Anwendung haben, die gleichzeitig auf ein Objekt in der Sitzung zugreift, müssen Sie Ihren eigenen Synchronisationsmechanismus bereitstellen nicht skalierbar sein und die Leistung stark beeinträchtigen. Im Falle von Stateful Session Beans verwaltet der Container die Synchronisation.

Hier finden Sie eine interessante Diskussion zum Thema "http-Sitzung zum Speichern von Status verwenden". Die Diskussion geht auf Brian Goetz 'sehr informativen Artikel "Sind alle Stateful Java Web Applications Broken?". Leider kann ich den Originalartikel auf der IBM Website nicht finden, aber der Diskussionsthread gibt genug Material zum Nachdenken.

    
Shailendra 13.11.2013, 06:42
quelle
3

Sie können natürlich Stateful-Bean verwenden, aber Sie können es einfach nicht injizieren, da eine einzelne Servlet-Instanz standardmäßig freigegeben werden kann, um mehrere Anfragen gleichzeitig zu bedienen, was bedeutet, dass Ihr Code nicht Thread-sicher ist. Sie können jedoch JNDI lookup immer in Ihrer doGet -Methode für Beispiel ausführen

%Vor%

Sehen Sie sich einige Tutorials an, um hier zu suchen.

    
Petr Mensik 13.11.2013 09:58
quelle

Tags und Links