Funktionsaufruf (asynchron?)

internet

Top Contributor
Hallo,

ich habe einen ganz normalen Prozess mit einer JAVA EE Web Applikation:
Von meiner JSF Page, drücke ich auf einen Button.
Der Button kommuniziert nun mit meiner Controller Klasse.
Die Controller Klasse ruft die Methode im Service Layer auf.

Nun habe ich aber bei einigen Methoden (zB createCustomer) innerhalb dieser Methode am Ende weitere Methodenaufrufe, zB "createNotification"....
Das funktioniert ja auch alles. Nur nun ist das Problem, dass der User in der GUI warten muss, bis die komplette "createCustomer" - Funktion durch ist.

Ich bräuchte nun die Möglichkeit, dass die weiteren Funktionen in einem anderen Thread o.ä. dann laufen?
JMS habe ich mal gehört - nur hier habe ich gar keine Erfahrung damit und wüsste adhoc nicht, wie ich dies dann mache, sodass einfach die Methoden am Ende der "createCustomer" - Funktion in einem anderem Prozess laufen, sodass der User nicht komplett warten muss, bis dies abgeschlossen ist.

Kann hier jemand helfen?
 

internet

Top Contributor
habe es gerade mal probiert, aber dann läuft die Methode gar nicht zu Ende?

Hier mal ein Beispiel, das ist die Klasse aus dem Service Layer.
Bis entityManager.merge(customer); soll der Button auf der GUI einen Ajax Status anzeigen (Methode wird ausgeführt).
Nun: sendWebhookServiceBean.executeWebhook(); soll ebenfalls ausgeführt werden, aber nicht mehr Teil des Ajax Status für den Button...

Java:
public void updateCustomer(Customer customer) {

        if (customer == null)
            throw new CustomerNotFoundException("This Customer doesn´t exist");

        // Hinzufügen
        entityManager.merge(customer);

        // Webhook
        if (customer.isCreateWebhook()) {
            sendWebhookServiceBean.executeWebhook();
        }

        LOGGER.debug("END updateCustomer");
    }
 

mihe7

Top Contributor
sendWebhookServiceBean.executeWebhook(); soll ebenfalls ausgeführt werden, aber nicht mehr Teil des Ajax Status für den Button...
Dann muss sendWebhookServiceBean injected sein (@Inject oder @EJB) und die Methode executeWebhook mit @Asynchronous annotiert sein. Außerdem muss der Rückgabewert entweder void oder Future sein.
 

internet

Top Contributor
ah, die aufrufende Methode muss so annotiert werden?
Ich habe diesen Beitrag gefunden - aber der Kollege hatte hiermit Probleme?

Java:
@Stateless
public class SessionBean1 {

    @Inject
    SessionBean2 sessionBean2;

    public void doTask1(){
        // task one stuff
        sessionBean2.doTask2();
    }

}
@Stateless
public class SessionBean2 {

    @Asynchronous
    public void doTask2(){
        // do task2 stuff
    }

}
 

mihe7

Top Contributor
ah, die aufrufende Methode muss so annotiert werden?
s. #5. Die Methode, die asynchron (in einem anderen Thread) ausgeführt werden soll, muss annotiert werden.

Ich habe diesen Beitrag gefunden - aber der Kollege hatte hiermit Probleme?
Hast Du denn auch gelesen, worin das Problem bestand?!? Dann müsstest Du gesehen haben, dass es hier um ein ganz grundsätzlichen Problem ging: Ressourcen sind nun einmal endlich. Das kann man bis zu einem gewissen Grad konfigurieren aber irgendwo ist auch mal Schluss; das sind Dinge, die man ggf. berücksichtigen muss.
 

internet

Top Contributor
perfekt - das klappt wunderbar...

Ressourcen sind nun einmal endlich. Das kann man bis zu einem gewissen Grad konfigurieren aber irgendwo ist auch mal Schluss; das sind Dinge, die man ggf. berücksichtigen muss.
d.h. wie läuft das ab? Wo finde ich die maximale Grenze?

Ich führe die Methode aus...Danach wird die Ausführung von (executeWebhook) in einen Pool gespeichert?
 

mihe7

Top Contributor
d.h. wie läuft das ab? Wo finde ich die maximale Grenze?
Das dürfte vom Application Server/Umgebung abhängig sein. Womit arbeitest Du denn?

Ich führe die Methode aus...Danach wird die Ausführung von (executeWebhook) in einen Pool gespeichert?
Ich kenne die Implementierungen nicht, aber denke mal, dass ein Callable in eine Queue mit einer gewissen Kapazität gelegt wird, die von einem ExecutorService mit einer gewissen Zahl von Threads abgearbeitet wird.
 

internet

Top Contributor
Das dürfte vom Application Server/Umgebung abhängig sein. Womit arbeitest Du denn?


Ich kenne die Implementierungen nicht, aber denke mal, dass ein Callable in eine Queue mit einer gewissen Kapazität gelegt wird, die von einem ExecutorService mit einer gewissen Zahl von Threads abgearbeitet wird.
ich arbeite mit WildFly...
 

mihe7

Top Contributor
Mit WildFly kenne ich mich nicht aus. Wenn ich mir https://docs.wildfly.org/19/Admin_Guide.html#EJB3 und https://docs.wildfly.org/19/wildscribe/subsystem/ejb3/thread-pool/index.html ansehe, würde ich mal vermuten, dass man in der betreffenden XML-Datei z. B. schreiben kann:
XML:
<async thread-pool-name="default"/>
<thread-pools>
  <thread-pool name="default">
    <queue-size count="100" /> <!-- max. 100 wartende Tasks -->
    <max-threads count="10"/>
    <core-threads count="10"/>
    <keepalive-time time="60" unit="seconds"/>
  </thread-pool>
</thread-pools>
Vermutlich ist eine Queue-Size von 0 eine unbeschränkte Queue.

ABER: das sind alles Vermutungen.
 

Ähnliche Java Themen

Neue Themen


Oben