@Asynchronous JEE6 funktioniert nicht

JanHH

Top Contributor
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)
 

stg

Top Contributor
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

Top Contributor
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

Top Contributor
<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.
 

Ähnliche Java Themen

Neue Themen


Oben