Im Spring Boot (Spring MVC) werden die Anforderungen standardmäßig synchronisiert. Ein Thread ist für die Vergangenheit und das Ende einer Anfrage verantwortlich. In vielen Fällen müssen einige Vorgänge asynchronisiert werden, um den Durchsatz zu verbessern. Zusätzlich zu einer zeitaufwändigen Geschäftslogik, die asynchronisiert werden kann, kann unsere Abfrageschnittstelle auch asynchron ausgeführt werden.
Eine Anfrage an den Dienst wird von einem Thread aus einem Webcontainer empfangen, z.
Wir können Webasynctask verwenden, um diese Anforderung an einen neuen Thread zur Ausführung zu verteilen, und HTTP-NIO-8084-EXEC-1 kann die Bearbeitung anderer Anforderungen erhalten. Sobald der Webasynctask Daten zurückgegeben hat, wird sie erneut aufgerufen und verarbeitet, und der Wert wird auf asynchrone Weise an die Anforderungsseite zurückgegeben.
Der Beispielcode lautet wie folgt:
@RequestMapping (value = "/login", method = requestMethod.get) public WebAsynctask <modelAndView> longTimetask () {System.out.println ("/login wird als Thread -ID bezeichnet:" + thread.currentThread (). GetName ()); CALLABLE <modellAndView> CALLABLE = NEW CALLABLE <modellAndView> () {public modelAndView call () löst Ausnahme aus {Thread.sleep (1000); /Simulieren Sie Langzeitaufgaben modelAndView mav = new ModelAndView ("Login/Index"); System.out.println ("Ausführungs erfolgreiche Thread -ID ist:" + Thread.currentThread (). GetName ()); MAV zurückgeben; }}; Neue WebaSynctask <modelAndView> (Callable);} zurückgeben;};Sie können das Ausgabeergebnis wie folgt sehen:
/Login heißt Thread-ID: HTTP-NIO-8084-EXEC-1
Ausführung erfolgreich Thread ID ist: MVCASYNC1
Der Thread vor der Ausführung der Geschäftslogik und des Threads, der sich speziell mit der Geschäftslogik befasst, sind nicht dasselbe, was unser Ziel erreicht.
Dann habe ich einen gleichzeitigen Test durchgeführt und festgestellt, dass ich ständig den MVCasync1 -Thread erstellt habe. Ich dachte, ist der Fadenpool nicht verwendet?
Nachdem ich den Quellcode gelesen hatte, stellte ich fest, dass dies wahr ist. WebasyncManager ist die zentrale Klasse für Spring MVC zur Verwaltung der asynchronisierenden Verarbeitung.
Die Standardeinstellung besteht darin, SimpleSynctaskexecutor zu verwenden, die für jede Anforderung einen neuen Thread erstellt.
private asynctaskexecutor taskexecutor = new SimpleAsynctaskexecutor (this.getClass (). GetImplename ());
Wenn die Aufgabe einen Executor angibt, verwenden Sie die Aufgabe. Wenn dies nicht der Fall ist, verwenden Sie den Standard -SimpleAsynctaskexecutor
Asynctaskexecutor executor = webasynctask.getExecutor (); if (Executor! = Null) {this.taskexecutor = Executor;}Wir können den Threadpool von Async konfigurieren, ohne ihn für jede Aufgabe separat anzugeben
Angeben von configurer.settaskexecutor (threadpooltaskexecutor ());
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework org.springframework.web.context.request.async.timeoutcallableProcessinginterceptor; import org.springframework.web.servlet.config.annotation.asyncSupportConfiger; Import org.springFramework.web.servlet.config.annotation.webmvcconFigurationsupport; @ConfigurationPublic Class webmvcconfig erweitert webmvcconFigurationsupport {@Override Public void voidDieSyncSupport (letztendlich asyncsupport) {Setdefort (60 asyncsupport) {Setdefort (60 asyncsupport) {-Setthupport (60 asyncsupport) {-SetphSupport (60 asyncsupport) 1000l); configurer.registerCallableInterceptors (timeoutInterceptor ()); configurer.settaskexecutor (threadpooltaskexecutor ()); } @Bean public TimeoutCallableProcessingInterceptor timeoutInterceptor () {Neue timeoutCallableProcessingInterceptor () zurückgeben; } @Bean public threadPooltaskexecutor threadpooltasexecutor () {Threadpooltaskexecutor t = new threadpooltasexecutor (); T.SetCorepoolSize (10); T.SetMaxpoolSize (50); T.SetThreadnamePrefix ("yjh"); return t; }}Nach der Konfiguration können Sie sehen, dass der Ausgabethreadname mit YJH beginnt und neue Threads nicht ständig erstellt werden.
Sie können das Ausgabeergebnis wie folgt sehen:
/Login heißt Thread-ID ist: HTTP-NIO-8084-EXEC-1-Ausführung erfolgreich Thread-ID ist: yjh1
Zusammenfassen
Das obige ist das, was der Editor in Spring Boot verwendet hat, verwendet Webasynctask, um die Ergebnisse asynchron zurückzugeben. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!