2014-01-30 12 views
7

Ich bin neu bei ejbs und ich möchte wissen, ob eine Stateful Session Bean zerstört wird oder nicht. Ich habe eine Stateful Session Bean in mein Servlet injiziert. Selbst nach 30 Minuten sehe ich, dass die Bohne aktiv ist. Ich benutze jboss eap 6.0. Ich glaube, dass HttpSession nichts mit einer Stateful Session Bean zu tun hat. Ich habe die HttpSession für ungültig erklärt, um sicherzustellen, dass HttpSession nichts mit der Statful-Session-Bean zu tun hat. Was passiert also, wenn meine Anwendung viele Benutzer hat und für jeden Benutzer, wenn ich eine neue Bean erstelle, die Leistung meines Servers herabgesetzt wird. Wie verwaltet der Container Stateful Session Beans? Wann wird eine Bohne entfernt oder zerstört?Wann wird die Stateful Session-Bean zerstört?

Ich lese this Post und einige andere. Aber ich habe keine Klarheit bekommen.

+1

Siehe die Oracle [Java EE 7 Tutorial] (http://docs.oracle.com/javaee/7/tutorial/doc/partentbeans.htm#BNBLR). Sie haben ein Beispiel für eine Statefull Session Bean. Wenn Sie eine skalierbare Anwendung erstellen möchten, sollten Sie sich vom Status des State-of-Full-Servers fernhalten und den Zustand des Clients beibehalten. – Ralf

+0

Danke, das hat geholfen. 'Wenn der Client beendet wird, scheint seine Session-Bean zu beenden und ist nicht mehr mit dem Client verbunden. Ich habe meinen Browser geschlossen und geöffnet und die gleiche Anfrage gesendet, und ich kann sehen, dass die Stateful Bean nicht mehr ist. –

+0

Das antwortet mir immer noch nicht genau wie es funktioniert. Ich weiß, dass es der Client ist, der eine Stateful Bean am Leben hält, aber wie funktioniert das in Bezug auf einen Browser? Ich gehe davon aus, dass Sie die EJB-Sitzung im Visier haben? – Gimby

Antwort

1

@SessionScoped Anmerkung macht nur Sinn in einem Web-Kontext, außerhalb eines Web-Kontext sollten Sie davon ausgehen, dass Ihr @SessionScoped ignoriert und Ihre Stateful EJB wird wie ein alter regelmäßigen Stateful ejb verhalten, und Sie sollten nicht eine Stateful Ressource injizieren (alte reguläre Stateful EJB) in eine statuslose EJB (Servlet), in diesem Fall hängt der Umfang Ihrer Stateful Ejbs vom Umfang der Instanzen Ihres Servlets und der Java Servlet Spec ab. Es ist nicht unbedingt erforderlich, dass der Container eine Servlet-Instanz pro Sitzung oder Anforderung erstellt. In der Tat verwenden einige Container eine einzige Instanz Ihres Servlets, um alle Clients zu bedienen. In diesem Fall würden Sie diese hässliche Situation haben wo eine einzelne Stateful EJB-Instanz alle Ihre Kunden dienen würde, check this out,

Stateful session beans unexpected behaviour when packaged in a war and packaged in an ear->jar

2

eine Stateful Session Bean kontextualisiert nicht Client und muss explizit im Code zerstört werden.

1) Die SFSB ein Verfahren, durch @Remove kommentierten definieren muss:

@Stateful 
@Local(ILocalQuiz.class) 
public class QuizBean implements ILocalQuiz{ 

//... 

    @Remove 
    @Override 
    public void end() { 
     System.out.println("QuizBean instance will be removed.."); 
    } 

} 

2) Die SessionScoped bean muss nennen explizit end() Methode:

public void cleanUp(){ 
    System.out.println("Cleaning up before destroying the SessionScoped bean."); 
    quizProxy.end(); 
}