# Frage zum Statefull Session Beans Lebenszyklus



## Deadalus (12. Okt 2009)

Hallo,

Projekt sieht folgendermaßen aus: EJB Container mit Geschäftslogik(SessionBeans) und Datenmanagement(JPA) und Web Client auf JSF Basis. 

Ich wollte man fragen wie genau das mit Statefull Session Beans aussieht. 

Erzeugt werden sie, wenn ich mich nicht täusche, beim 1. Aufruf einer SessionBean Methode.

Aber wann werden die SessionBeans wieder zerstört (beendet)? Muss dazu immer explizit eine im Bean mit "@Destroy" annotierte Methode aufgerufen werden, oder werden die Beans auch gelöscht wenn ich im die BrowserSession terminiere? (request.getSession().invalidate(); )


----------



## JanHH (13. Okt 2009)

Stateful EJBs werden vom Application Server frei nach dessen Gusto verwaltet, man hat auf den Lebenszyklus keinen Einfluss. Sinn dessen ist, dass der AS unter performance- und speicheraspekten optimieren kann. In der Regel werden sie soweit ich weiss nicht per Session (bzw. bei Bedarf) neu erzeugt, sondern in einem Pool verwaltet. Daher die Create- und Remove-/Destroy-Annotationen, mit denen man sie initialisieren und nach Benutzung wieder in einen "jungfräulichen" Zustand zurücksetzen kann, so dass sie wieder in den Pool zurückkommen. Also an diese Regeln halten, einfach benutzen und nicht weiter drüber nachdenken.. der AS wirds schon richten.


----------



## Deadalus (13. Okt 2009)

Hmm ich hoffe mal du hast recht. 

@Destroy sollte das SessionBean allerdings wirklich entfernen. Zum zurücksetzen gibt es ja @PreDestroy.


----------



## FArt (13. Okt 2009)

Na ja, so ganz nach Gusto macht das der Container auch nicht. 

Die Statusübergänge (und somit auch die Callbacks) sind in der EJB Spec im Absatz 4.4 dargestellt.
Timeouts (z.B. bzgl. Passivierung und löschen von inaktiven SFSB) werden am Container konfiguriert (oder am Appserver-spezifischen Deploymentdeskriptor). Hier sind aber tatsächlich nur die Statusübergänge und bestimmt Abfolgen definiert (z.B. newInstance->DI->PostConstruct->Init zum Erstellen).

Das ist die Sicht des EJB Containers (und des "Clients"). Ob eine Beaninstanz z.B. über einen Cache wiederverwendet wird, ist dabei absolut irrelevant und hat mit den Callbacks nichts zu tun, auch nicht mit "destroy".
Die Callbacks sind nur dazu da, die eigenen Ressourcen sinnvoll behandeln zu können.

Ein SFSB sollte immer nach Gebrauch aktiv beendet werden. Wenn also ein SFSB aus einem Servlet verwendet wird, sollte man über den Lifecycle des Servlets auch das SFSB entsprechend steuern.


----------

