2009-07-10 7 views
3

Ich experimentiere mit EJB3 auf JBoss und entwickle eine zustandslose Bohne. Grundsätzlich, sobald das Modul bereitgestellt wurde, muss ich einige Aktionen ausführen, um die Anwendungseinstellungen zu laden. Dazu habe ich eine Methode wie @PostConstruct annotiert, die, so weit ich aus der API weiß, den Container anweist, es aufzurufen, sobald die Bean bereitgestellt und bevor sie in Betrieb genommen wurde. (korrekt?) Jetzt bin ich verwirrt, weil von der Anmeldung diese Methode aussieht, wird nicht einfach aufgerufen, nachdem es bereitgestellt wurde, aber bevor jede offengelegte Methode aufgerufen wird. Ich muss diese Methode nur einmal aufrufen, nicht jedes Mal, wenn sie einen Anruf empfängt. Was wäre der beste Ansatz?java ejb3 @PostConstruct

Vielen Dank im Voraus

Alessandro Ilardo

+0

Ich denke, Tim den Punkt kam, wird der Behälter die PostConstruct kommentierten Methode jedes Mal auf derselben EJB-Instanz nicht nennen, aber es ist Instancing tatsächlich eine neue EJB-Instanz für jede nennt es empfängt, vielleicht einige Pool-Einstellungen durch. – AleIla

+0

Nicht sicher, ob es in diesem speziellen Fall hilft, aber wenn Sie Community-Version von JBoss (wie 5.1 AS) verwenden, stellen Sie sicher, dass Sie den neuesten EJB3-Code verwenden, indem Sie das neueste EJB3-Plugin von http: //www.jboss installieren. org/ejb3. Bezahlt für die Version von JBoss hat es automatisch, aber für die Gemeinschaft müssen Sie es manuell aktualisieren. –

Antwort

2

A stateless Bean genau das sein sollte - staatenlos. Das bedeutet, dass Sie in der Lage sein sollten, zu unterscheiden, ob die Bohne aus einem Pool gezogen oder auf Anfrage für Ihre Anfrage konstruiert wurde. Ich kann mir nur schwer vorstellen, wie sich PostConstruct auf eine zustandslose Umgebung anwenden lässt, da ich diese Funktion immer benutze, um den Zustand eines Beans fertigzustellen.

Offenbar verzichtet JBoss entweder auf das Poolen zustandsloser Bohnen und konstruiert sie jedes Mal frisch, oder wenn es Pooling verwendet, werden sie so behandelt, als ob sie jedes Mal rekonstruiert würden (da sie keine Zustandsinformationen enthalten sollten). Ich bin eigentlich etwas überrascht, dass es das PostConstruct überhaupt anspricht.

+14

Staatenlos bedeutet nur "kein Gesprächszustand", es bedeutet überhaupt keinen Staat. Sie haben fast sicher Kollaborationsobjekte in ihnen und @PostConstruct kann verwendet werden, um diese zu initialisieren. – skaffman

0

Es ist Aufgabe des App-Servers, den Lebenszyklus von EJBs zu verwalten. Es kann beschließen, Bohnen zu konstruieren, zu initialisieren und abzureißen, wann immer sie es für richtig halten. Es kann sein, dass jeder Aufruf Ihrer stateless Bohne auf einer neuen Instanz Ihrer Bean-Klasse steht, obwohl das anscheinend eine Nebensache ist.

Ruft der App-Server die @ PostConstruct-Methode mehrmals für dieselbe Objektinstanz oder jedes Mal für eine andere Instanz auf? Versuchen Sie, Protokollanweisungen innerhalb des Konstruktors und der @ PostConstruct-Methode anzuhängen.

0

Wie viele SLSB haben Sie in Ihrem Pool? Abhängig von dem Container kann die nicht aufgerufen werden, bis der erste Client darauf zugreift (nicht sicher über JBoss), deshalb könnte es sein, dass es so aussieht, als wäre es auf jedem Zugriff. Es wäre interessant zu sehen, ob es aufgehört hat, die post-construct-Methode aufzurufen, nachdem die Methode so oft aufgerufen wurde, wie es Ihrer Poolgröße entspricht.

Wenn Sie einige teure Aktionen in Ihrer Post-Konstrukt-Methode durchführen, dann tun Sie diese vielleicht in einem SFSB beim Start und "injizieren" Sie diesen SFSB in Ihren SLSB im Post-Konstrukt.

1

Zuerst wird PostConstruct aufgerufen, bevor die erste Methode auf der Bean aufgerufen wird. Wenn keine Methode aufgerufen wird, wird kein Post-Konstrukt aufgerufen.

Zweitens können Sie inverse Aktionen in PreDestory-Methode ausführen, um Nebenwirkungen zu entfernen.

Egal, welche Art von Aktion müssen Sie ausführen?

+0

Die Aktion ist nur eine und ruft eine Klasse auf, die eine XML-Datei entpackt. Jemand hat mir vorgeschlagen, stattdessen @Resource zu verwenden, nicht klar, ob er diesen Code in eine SFSB verschieben wollte. – AleIla

+0

@Mykola Golubyev: Was Sie in der Antwort angeben, gilt nur für Staatenlose Bohnen. Ein Stateful Session Bean wird instanziiert, sobald der Client eine Referenz darauf erhält, entweder mit JNDI-Lookup oder Dependency Injection, und zu diesem Zeitpunkt wird die PostConstruct-Methode aufgerufen. – arjacsoh

+0

In Wildfly 8.1 wird @PostConstruct (in einem zustandslosen EJB) eindeutig beim Start der Anwendung aufgerufen, egal ob eine Methode aufgerufen wird oder nicht. Plus, es wird vor der Ausführung einer Service-Methode aufgerufen (ich weiß noch nicht, wie ich das verhindern kann). – cslotty

0

PostConstruct wird aufgerufen, bevor der Client eine Biz-Methode ausführt. Dies bedeutet, dass wenn die Bean nicht gepoolt wird, der Container die Bean instanziiert, eine Injektion durchführt, die @ PostConstruct-Methode aufruft und dann zulässt, dass die Biz-Methode ausgeführt wird.

Im Falle einer gepoolten Be wird die @ PostConstruct-Methode jedes Mal ausgeführt, wenn die Bean aus dem Pool gezogen wird. Bei statuslosen Beans wird dies zwischen jedem Methodenaufruf sein. Bei Stateful-Beans wird dies nach dem Client-Lookup oder der Injektion erfolgen.

Wenn Sie etwas über die Anwendungsbereitstellung ausführen müssen Ihre Optionen auf der Version von Java EE abhängen Sie haben.

für Java EE 6 Sie können @Startup auf einem @Singleton EJB verwenden, die eine @PostConstruct Methode enthält.

für Java EE 5 und früheren es eine ServletContextListener in einem Web-Archiv verwenden. Wenn Sie möchten, kann der ServletContextListener eine EJB aufrufen.

Was jedoch eine wichtigere Frage sein könnte, ist, wo Sie diese Anwendungseinstellungen laden möchten? Wenn Sie mit einer nicht gruppierten Einzel-JVM-Konfiguration arbeiten, werden Sie diese wahrscheinlich in einen Singleton eines Typs laden wollen. In Java EE 5- müssen Sie das Singleton-Entwurfsmuster selbst implementieren oder in EE 6 den @Singleton-EJB-Typ verwenden.