Vor kurzem habe ich auf eine Anforderung gestoßen. Wenn der Server eine Anfrage erhält, muss die Aufgabenausführung nicht vor der Rückgabe des Ergebniss ausgeführt werden. Es kann das Ergebnis sofort zurückgeben und die Aufgabe asynchron ausführen lassen. Das erste, was Sie in Betracht ziehen sollten, ist, einen neuen Thread zu starten, um die Aufgabe auszuführen oder die Aufgabe zur Ausführung an einen Thread -Pool zu senden. Beide Methoden sind in Ordnung. Aber der Frühling ist so mächtig, dass es eine einfachere Methode geben muss. Ich habe es gerade gegoogelt und es hat es wirklich. Verwenden Sie einfach die beiden Anmerkungen @enableAsync und @aSync, um in Ordnung zu sein.
Fügen Sie der Methode @Async Annotation hinzu
Paket me.deweixu.aysncdemo.service; öffentliche Schnittstelle AsyncService {void AsyncMethod (String arg);} Paket me.deweixu.ayncdemo.service.ipml; import me.deweixu.aysncdemo.service.asyncService; import org.springFramework.Scheduling.Annotation.async; AsyncService {@aSync @Override public void asyncMethod (string arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + Thread.currentThread (). GetName () + "===================================================================================================================================================================================. @EnableAsync
Fügen Sie @enableasync Annotation zur Startklasse oder der Konfigurationsklasse hinzu
Paket me.deweixu.aysncdemo; import org.springframework.boot.springApplication; AysncDemoApplication {public static void main (String [] args) {SpringApplication.run (ayncDemoApplication.class, args); }} prüfen
Paket me.dewexu.aysncdemo; import me.deweixu.aysncdemo.service.asyncservice; import org.junit.test; import org.junit.runner.runerwith; org.springframework.boot.test.context.springboottest; import org.springframework.test.context.junit4.springrunner; @Test public void testaSync () {System.out.println ("=====" + Thread.currentThread ().==================
2018-03-25 21: 30: 31.391 Info 28742 --- [Main] .saannotationAsyncexeCutionInterceptor: Keine Aufgabe Executor Bean für asynchronisierte Verarbeitung gefunden: keine Bean von Typ Taskexecutor und keine Bean mit dem Namen 'Taskexecutor' 'entweder
Arg: Async
===== SimpleAsynctaskexecutor-1 =============
Aus den obigen Ergebnissen wird asyncService.asyncMethod ("async") tatsächlich asynchron ausgeführt und verwendet einen neuen Thread.
Geben Sie den Testamentsvollstrecker an
Aus dem obigen Ausführungsprotokoll können Sie erraten, dass Spring SimpleSynctaskexecutor standardmäßig asynchron ausführen. Sie können nach dieser Klasse suchen. @ASync kann auch einen benutzerdefinierten Ausführenden angeben.
Fügen Sie der Startklasse einen benutzerdefinierten Executor hinzu
Paket me.deweixu.ayncdemo; import org.springframework.boot.springapplication; org. } @Bean (name = "threadpooltaskexecutor") public Executor threadpooltaskexecutor () {return New threadPooltaskexecutor (); }}Geben Sie den Testamentsvollstrecker an
Paket me.deweixu.ayncdemo.service.ipml; import me.deweixu.aysncdemo.service.asyncService; import org.springFramework.Scheduling.Annotation.async; AsyncService {@aSync ("threadpooltaskexecutor") @Override public void AsyncMethod (String arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + Thread.currentThread (). GetName () + "=========================================================================================================================================================================);}}Verwenden Sie auf diese Weise Threadpooltaskexecutor bei der asynchronen Aufgaben
Legen Sie den Standard -Executor fest
Wie oben erwähnt, wird der SimpleAsynctasKexecutor, wenn @aSync keinen Ausführenden angibt, standardmäßig verwendet. Tatsächlich kann der Standard -Executor mithilfe der AsyncconFigurer -Schnittstelle konfiguriert werden.
@ConfigurationPublic Class springasyncconfig implementiert asyncconfiger {@Override public executor getaSyncexecutor () {return New threadPooltaskexecutor (); }} Ausnahmeaufnahme
Ausnahmen können bei asynchronen Ausführungsmethoden auftreten. Wir können den Versuch in der Aufgabe verwenden, um Ausnahmen zu behandeln. Wenn die Aufgabe eine Ausnahme ausgelöst hat, bietet Spring auch eine Methode, um sie zu fangen.
Implementieren Sie die AsyncuncaughexceptionHandler -Schnittstelle
öffentliche Klasse CustomaSyncexceptionHandler implementiert asyncuncaughtexceptionHandler {@Override public void HandleCaughTexception (Throwable Throwable, Method -Methode, Objekt ... obj) {System.out.println ("Ausnahmenachricht -" + Throwable.getMessage ()); System.out.println ("Methodenname -" + method.getName ()); für (Objektparam: OBJ) {System.out.println ("Parameterwert -" + Param); }}}Implementieren Sie die AsyncconFigurer -Schnittstelle umschreiben GetAsyncungaugtexceptionHandler -Methode um
@ConfigurationPublic Class springasyncconfig implementiert asyncconfiger {@Override public executor getaSyncexecutor () {return New threadPooltaskexecutor (); } @Override public asyncungaughtexceptionHandler getaSyncuncaugtexceptionHandler () {return New CustomAsyncexceptionHandler (); }}Schreiben Sie die asyncMethod -Methode neu, damit sie eine Ausnahme ausgelegt hat
@Async @Override public void asyncMethod (string arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + Thread.currentThread (). GetName () + "=============================================================================================================================================================== -out.out.out.out.out.Auslaufergebnisse:
==================
Arg: Async
===== Threadpooltaskexecutor-1 ============
Ausnahmenachricht - Async nullPointerexception
Methodenname - AsyncMethod
Parameterwert - asynchronisiert
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.