EJB binding bevor die EJB gebunden ist

Kris

Bekanntes Mitglied
Hi zusammen

Es gibt zwei Beans. Eine Singleton und eine Stateful. Die Singleton hat die Stateful als Klassenvariable, die im Konstruktor initialisiert wird. Leider ruft die Sigletone Bean die Stateful, bevor diese im NamingContext gebunden ist. Wie kann man bestimmen, welche Beans zuerst gebunden werden sollen, bzw. welche von welchen abhängen.
 

FArt

Top Contributor
Wenn ich das Konstrukt so sehe, würde ich auf jeden Fall immer fragen, was du mit diesem Konstrukt bezweckst, denn vermutlich könnte es eine besssere, im EE Umfeld günstigere Lösung für dein Problem geben. Also frage ich: was willst du wirklich erreichen?

Prinzipiell kann du ja einfach das Bean injecten lassen, dann werden Abhängigkeiten automatisch erfüllt. Oder du nutzt @Depends, wenn du auf dem JBoss unterwegs bist.
 

Kris

Bekanntes Mitglied
Ich habe ein Singleton, das als Cache für Daten dient. In diesem soll eine dao Bean vorhanden sein, welche die Methoden für die Datenbankspeicherung beinhaltet. Diese Bean soll direkt im Konstruktor erzeugt werden. Leider wird das Singletone erstellt, bevor die DAO Bean gebunden wird, somit findet die @EJB Notation keine passende Bean zur Variable.

Was meinst du genau mit Injecten?
 

mvitz

Top Contributor
Also, ich glaube dein Problem liegt daran, dass du versuchst eine "STATEFULL"-Bean zu injecten.

Erstmal dazu die Frage: Wenn diese Bean ein DAO ist, wieso muss sie Statefull sein? Normalerweise braucht ein DAO keinen State und kann deshalb Stateless sein.

Wieso das ganze vermutlich nicht funktioniert:

Ich bin mir zwar gerade nicht 100% sicher und auch noch zu müde/lustlos um das jetzt selber zu Googlen, aber es gibt ja genau 1 Singleton pro Instanz deiner JavaEE Anwendung. Statefull-Beans gibt es für jeden Nutzer des Systems. (Werden bei Bedarf neu erstellt/wieder abgebaut).

Welche dieser Instanzen deiner Statefull-Bean soll denn jetzt in das Singleton injeziert werden?

Edit: Weiterhin sollte man Caching wohl anders lösen.
 

Kris

Bekanntes Mitglied
Es gibt eine Klasse, die als Singletone instanziert wird. Diese wird nur einmal in der anwendung erzeugt.

Dann gibt es die Statelessbean, die in diesem Singletone aufgerufen werden soll.

Es würde funktionieren, wenn beim deployen die Statelessbean vor der Instanzierung des Singletone, in den Namingcontext aufgenommen werden würde.
 

FArt

Top Contributor
Im Konstruktor darfst du nichts erstellen, der Aufruf läuft außerhalb der Spec. Halte dich an den Lebenszyklus von EJBs und nimm die Initialisierungsmethode des Beans. Ausserdem dachte ich mir schon, dass du hier eine suboptimale Lösung für ein "Problem" baust.

Caching übernimmt die DB oder die Persistenzschicht. Mach das nicht selber, schon gar nicht in einer EE Umgebung, in der du dich nicht auskennst, d.h. die Spec nicht kennst und nicht weißt, wie sich Container und Beans verhalten bzw. in welchem Kontext sie laufen!
 

FArt

Top Contributor
Also, ich glaube dein Problem liegt daran, dass du versuchst eine "STATEFULL"-Bean zu injecten.

Erstmal dazu die Frage: Wenn diese Bean ein DAO ist, wieso muss sie Statefull sein? Normalerweise braucht ein DAO keinen State und kann deshalb Stateless sein.

Wieso das ganze vermutlich nicht funktioniert:

Ich bin mir zwar gerade nicht 100% sicher und auch noch zu müde/lustlos um das jetzt selber zu Googlen, aber es gibt ja genau 1 Singleton pro Instanz deiner JavaEE Anwendung. Statefull-Beans gibt es für jeden Nutzer des Systems. (Werden bei Bedarf neu erstellt/wieder abgebaut).

Welche dieser Instanzen deiner Statefull-Bean soll denn jetzt in das Singleton injeziert werden?

Edit: Weiterhin sollte man Caching wohl anders lösen.

Ich bin auch gerade zu faul nachzusehen, aber ich glaube laut Spec ist es nicht verboten. Es ist nur oft sinnlos.
 

mvitz

Top Contributor
Kleines Beispiel:

Java:
@Stateful
@LocalBean
public class MyStatefulBean {

    public MyStatefulBean() {
        System.out.println("MyStatefulBean: Constructor");
    }

    @PostConstruct
    public void init() {
        System.out.println("MyStatefulBean: init");
        System.out.println("  " + toString());
    }

}
Java:
@Stateless
@LocalBean
public class MyStatelessBean {

    public MyStatelessBean() {
        System.out.println("MyStatelessBean: Constructor");
    }

    @PostConstruct
    public void init() {
        System.out.println("MyStatelessBean: init");
        System.out.println("  " + toString());
    }

}
Java:
@Singleton
@Startup
public class MySingleton {

    @EJB
    private MyStatelessBean stateless;
    @EJB
    private MyStatefulBean stateful;

    public MySingleton() {
        System.out.println("MySingleton: Constructor");
        System.out.println("  stateless = " + stateless);
        System.out.println("  stateful  = " + stateful);
    }

    @PostConstruct
    public void init() {
        System.out.println("MySingleton: init");
        System.out.println("  " + toString());
        System.out.println("  stateless = " + stateless);
        System.out.println("  stateful  = " + stateful);
    }

}

Produziert bei mir folgende Ausgaben:
Code:
INFO: MySingleton: Constructor
INFO:   stateless = null
INFO:   stateful  = null
INFO: MyStatefulBean: Constructor
INFO: MyStatefulBean: Constructor
INFO: MyStatefulBean: init
INFO:   de.mvitz.examples.ejb.singleton._MyStatefulBean_Serializable@6ad18a
INFO: MySingleton: init
INFO:   de.mvitz.examples.ejb.singleton.MySingleton@c3507d
INFO:   stateless = de.mvitz.examples.ejb.singleton.MyStatelessBean@d965ea
INFO:   stateful  = de.mvitz.examples.ejb.singleton.MyStatefulBean@b1fba0
 

Kris

Bekanntes Mitglied
Bei mir das hier:

Java:
12:44:51,978 INFO  [STDOUT] MySingleton: Constructor
12:44:51,994 INFO  [STDOUT]   stateless = null
12:44:51,994 INFO  [STDOUT]   stateful  = null
12:44:52,025 INFO  [STDOUT] MyStatefulBean: Constructor
12:44:52,040 INFO  [STDOUT] MyStatefulBean: init
12:44:52,040 INFO  [STDOUT]   beans.MyStatefulBean@53e2b024
12:44:52,040 INFO  [STDOUT] MyStatefulBean: Constructor
12:44:52,072 INFO  [STDOUT] MySingleton: init
12:44:52,072 INFO  [STDOUT]   beans.MySingleton@28c800e7
12:44:52,072 INFO  [STDOUT]   stateless = No-Interface view for endpoint [ jboss.j2ee:jar=zz.test.jar,name=MyStatelessBean,service=EJB3 ]
12:44:52,072 INFO  [STDOUT]   stateful  = No-Interface view for endpoint jboss.j2ee:jar=zz.test.jar,name=MyStatefulBean,service=EJB3 ] and session a2t3mr-r17tjq-glp1n2yu-1-glp1nneh-db
12:44:52,103 INFO  [STDOUT] MySingleton: Constructor
12:44:52,103 INFO  [STDOUT]   stateless = null
12:44:52,103 INFO  [STDOUT]   stateful  = null
 

FArt

Top Contributor
... und wie du siehst verhalten sich die Container unterschiedlich. Zugesichert wird nur der Lebenszyklus der Beans und der Kontext in dem die Callbacks ablaufen.
 

Neue Themen


Oben