@Asynchronous JEE6 funktioniert nicht

Dieses Thema @Asynchronous JEE6 funktioniert nicht im Forum "Application Tier" wurde erstellt von JanHH, 24. Mai 2016.

Thema: @Asynchronous JEE6 funktioniert nicht Habe eine EJB (stateful) mit einer service-Methode, die ganz simpel per jsf commandButton aufgerufen wird. Soweit so...

  1. 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)
     
  2. Vielleicht hilft dir das Java-Tutorial weiter. Hier klicken --> (Klick)
  3. stg
    stg
    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.
     
  4. Soll man das nicht so machen? Das wäre mir eigentlich neu.
     
  5. stg
    stg
    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.
     
  6. <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.
     
  7. Schau dir jetzt hier den Kurs an und lernen Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)