@Asynchronous JEE6 funktioniert nicht


JanHH

Mitglied
Habe eine EJB (stateful) mit einer service-Methode, die ganz simpel per jsf commandButton aufgerufen wird. Soweit so gut.

wenn ich da nun @Asynchronous drüber schreibe, sollte es doch eigentlich so sein, dass JSF sofort nach Button-click die nächste Seite anzeigt und die Service-Methode unabhängig davon in einem eigenen Thread im Hintergrund ausgeführt wird, oder?

Ist aber nicht der Fall. JSF wartet bist die Methode abgearbeitet ist und zeigt erst dann die nächste Seite an, also ganz normal synchron in einem Thread.

Was übersehe ich da?

(Jboss 7.1.1)
 

Hinweis: Wenn du jetzt Java lernen möchtest, dann schau dir diese kurze Präsentation hier an (hier klicken!)
Sichere dir hier den Zugriff auf umfangreiches Java-Know How und starte richtig durch!

Hinweis: Wenn du jetzt Java lernen möchtest, dann schau dir diese kurze Präsentation hier an (hier klicken!)
Sichere dir hier den Zugriff auf umfangreiches Java-Know How und starte richtig durch!

stg

Bekanntes Mitglied
Die EJB Annotation greifen nur,wenn du die Methoden auch durchs Framework hindurch aufrufst.

Was bei dir genau schief läuft ist ohne Code schwer zu sagen. Was ich aber in deine Frage hinein-interpretiere ist, dass du deine EJB direkt aus der JSF View heraus ansteuerst, du sie also zusätzlich auch als Backing Bean für deine VIew verwendest. Du hast sie daher vermutlich auch als JSF Managed Bean oder CDI Named Bean annotiert, richtig? Mach so was einfach nicht, sondern trenne klar die Schichten deiner Anwendung, dann hast du solche Probleme auch nicht.
Also CDI (oder JSF Managed Bean) als Backing für deine View. Aus der JSF View heraus rufst du deine Action method aus der Backing Bean auf. Die Backing Bean injiziert die EJB und delegiert den Aufruf an die @Asyncronous method aus der EJB.
 

stg

Bekanntes Mitglied
Was man wie machen soll oder nicht ist nicht die richtige Frage, da scheiden sich die Geister ja grundsätzlich, sobald es mehr als eine Möglichkeit gibt.

Vielleicht funktioniert es ja sogar so, wie du es machen willst und das Problem liegt ganz woanders. Wenn du einfach mal ein Minimalbeispiel postest, dann kann man da ggfls mehr zu sagen.

Erfahrungsgemäß treten viele Probleme aber gar nicht erst auf, wenn man sauber die Verantwortlichkeiten trennt.
 

JanHH

Mitglied
<h:commandButton action="#{myBean.doSomething}" />

...

@Asynchronous
public void doSomething()
{
System.out.println("vorher");
do_something(); // dauert diverse Sekunden
System.out.println("nachhher");
}

Die JSF-Seite wird erst nachdem "nachher" auf der Konsole erscheint aktualisiert.
 

Passende Stellenanzeigen aus deiner Region:


Neue Themen

Oben