So verwenden Sie @Async im Frühling richtig

8

Ich habe eine Frage zu Spring @Async Annotation und wie man sie richtig benutzt. Sagen wir, ich habe diese Methoden:

%Vor%

Muss ich @Async für alle drei Methoden haben, damit es asynchron aufgerufen wird oder ist es genug, um es nur auf test3 zu haben, was die Arbeit tatsächlich erledigt?

    
Vedran Kopanja 30.11.2015, 08:52
quelle

3 Antworten

3

Sie brauchen es nur bei einer Methode. Nur weil ein neuer Thread mit der ersten @Async -Methode gestartet wird, ist as asynchron zur aufrufenden Methode.

Aber was das für Sie bedeutet, hängt stark davon ab, was Ihr Beispiel veranschaulichen soll:

1) In Ihrem Fall ist also @Async für test1(String param1) genug, wenn Sie test2 und test3 bis test1 aufrufen.

%Vor%

Beachten Sie, dass die Methoden 2 und 3 privat sind

2) Aber wenn Ihr Beispiel eine Methode darstellt, die Muster für Standardparameter überlädt ( Methodenverkettung ), dann ist es komplizierter. Dann müssten Sie die Annotation @Async bei der Methode haben, die das echte Zeug macht. Weil Sie die reale Ausführung nur asynchron ausführen möchten, aber nicht einen asynchronen Aufruf für jeden Verkettungsschritt.

%Vor%

Beachten Sie, dass alle Methoden nur mit test (Methodenverkettungsmuster) benannt sind

Das Problem dabei ist, dass Spring (ohne echtes AspectJ load- oder kompilierbares Weben) keine Methode async ausführt, wenn sie über this ! aufgerufen wird! (siehe Ссылка )

    
Ralph 30.11.2015, 09:22
quelle
2

Ich denke @Ralph hat Ihre Bedenken gedeckt.

Da der Name der Frage jedoch lautet: "Wie verwende ich @ Async richtig im Frühling", muss ich Folgendes erwähnen:

Sie sollten den Standardtask-Executor im Spring-Kontext immer ändern (oder zumindest daran denken, ihn zu ändern) oder einen benutzerdefinierten Task-Executor verwenden.

Weil:

  

Standardmäßig wird ein SimpleAsyncTaskExecutor zur Verarbeitung von Async verwendet   Methodenaufrufe.

und:

>
  

HINWEIS: Diese Implementierung verwendet keine Threads! Ziehen Sie stattdessen eine Thread-Pooling-TaskExecutor-Implementierung in Betracht, insbesondere für   Ausführen einer großen Anzahl von kurzlebigen Aufgaben.

    
luboskrnac 30.11.2015 11:26
quelle
0

Die Verwendung von @Async nur für die dritte Methode test3 ist nicht genug, weil das lokale Aufrufen bewirkt, dass das Objekt nicht proxied ist, und nur proxied Objekte (die aus dem Container abgerufen werden, z. B. @Autowired verwenden) Async-Aufrufe

Siehe auch hier

    
k0ner 30.11.2015 09:17
quelle