Übergabe des Status zwischen den EJB-Methoden / @RequestScoped und @Stateless

8

Ich habe eine @RequestScoped-CDI-Bean, die ich in ein EJB verwandeln möchte, um deklarative Transaktionen zu erhalten. (Ich bin auf EJB 3.1, Java EE 6)

Momentan übertrage ich den Status zwischen Subroutinen unter der Annahme, dass die Instanz nur in einer einzigen Anfrage verwendet wird. Wenn ich jetzt @Stateless hinzufüge, würde sich die Annahme ändern.

Ich möchte zum Beispiel etwas wie

machen %Vor%

Ich nehme an, das obige funktioniert nicht - ist das richtig?

Ich denke über zwei Alternativen nach:

  • Verwenden Sie @Stateful anstelle von @Stateless, zusammen mit @Named und @RequestScoped.
  • @Stateless beibehalten und EJBContext.getContextData map verwenden, um Instanzvariablen zu ersetzen.

Was ist besser? Und gibt es eine andere Alternative, an die ich nicht denke? (Neben dem Warten auf Java EE 7 oder Wechseln zu Spring.: -))

    
wrschneider 03.01.2012, 03:00
quelle

3 Antworten

12

Während @Stateless , @Singleton und @MessageDriven Bereichsreferenzen haben können, die über @Inject eingefügt werden, können sie nicht % @RequestScoped oder einen anderen Bereich sein. Nur das Modell @Stateful ist flexibel genug, um Bereiche zu unterstützen. Mit anderen Worten, Sie können die @Stateful -Bohnen-Klasse selbst als @RequestScoped , @SessionScoped usw. annotieren.

Vereinfacht ausgedrückt haben @Stateless , @Singleton bereits "Bereiche" festgelegt. @Singleton ist im Wesentlichen @ApplicationScoped und @Stateless wäre vielleicht ein erfundener Bereich wie @InvocationScoped , falls dieser existiert. Der Lebenszyklus einer @MessageDriven -Bohne hängt vollständig vom Connector ab, der sie steuert, und darf daher auch keinen benutzerdefinierten Bereich haben.

Siehe auch Ссылка

    
David Blevins 04.01.2012, 00:12
quelle
3

Ich würde mit SFSB anstelle von SLSB gehen. Du willst einen Staat halten, also ist das für mich die wichtigste Information - das ist ein Job für Stateful EJB.

Ich glaube auch nicht, dass EJBContext#getContextData() dir helfen würde. Soweit ich mich erinnere, ist es nur für eine Dauer eines Anrufs gültig. Daher wird bei jedem Aufruf einer Methode in Ihrem EJB eine neue Kontextdatenzuordnung erstellt (zumindest ist es das, was ich erwarten würde.)

    
Piotr Nowicki 03.01.2012 08:54
quelle
1

Wenn Sie statusfreie Beans verwenden, sind Sie für jede Statusverwaltung verantwortlich. Normalerweise würden Sie dies in der Web-App-Ebene mithilfe von HttpSessions tun. Und ja, Sie können keine Instanzvariablen verwenden, da statusfreie Beans gepoolt werden.

    
Aravind R. Yarram 03.01.2012 03:20
quelle

Tags und Links