En Spring Boot (Spring MVC), las solicitudes se sincronizan de forma predeterminada. Un hilo es responsable del pasado y el final de una solicitud. En muchos casos, para mejorar el rendimiento, algunas operaciones deben ser asincronizadas. Además de una lógica comercial que lleva mucho tiempo que puede asincronizar, nuestra interfaz de consulta también se puede ejecutar de manera asincrónica.
Una solicitud al servicio es recibida por un hilo de un contenedor web, como el subproceso HTTP-NIO-8084-EXEC-1
Podemos usar WebAsyncTask para distribuir esta solicitud a un nuevo hilo para la ejecución, y HTTP-NIO-8084-EXEC-1 puede recibir el procesamiento de otras solicitudes. Una vez que WebAsyncTask devuelve datos, se llamará y procesará nuevamente, y el valor se devolverá al lado solicitante de manera asincrónica.
El código de muestra es el siguiente:
@RequestMapping (valor = "/login", método = requestmethod.get) public WebasyncTask <ModelyView> longtimeTask () {system.out.println ("/login se llama id id es:" + thread.currentThread (). GetName ()); Callable <ModelAndView> Callable = new Callable <ModelAndView> () {public ModelAndView Call () lanza la excepción {Thread.sleep (1000); /Simular tareas a largo plazo ModelAndView mav = new ModelAndView ("Login/index"); System.out.println ("Ejecución exitosa de ID de subproceso es:" + thread.currentThread (). GetName ()); regresar mav; }}; Devuelve nuevo WebasyncTask <ModelAndView> (llameable);}Puede ver el resultado de salida de la siguiente manera:
/El inicio de sesión se llama ID de subprocesos es: HTTP-NIO-8084-EXEC-1
Ejecución El ID de hilo de ejecución es: MVCASYNC1
El hilo antes de ejecutar la lógica comercial y el hilo que trata específicamente con la lógica comercial no son el mismo, lo que logra nuestro objetivo.
Luego hice una prueba concurrente y descubrí que constantemente estaba creando el hilo MVCasync1. Estaba pensando, ¿no se usa el grupo de hilos?
Después de leer el código fuente, descubrí que esto es cierto. WebAsyncManager es la clase central para Spring MVC para administrar el procesamiento de async.
El valor predeterminado es utilizar simplesynctaskexecutor, que creará un nuevo hilo para cada solicitud.
privado asynctaskexecutor taskExecutor = new SimpleAsyncTaskExecutor (this.getClass (). GetSimpLename ());
Si la tarea especifica un ejecutor, use la tarea especifica. Si no es así, use el valor predeterminado de SimpleAsynctaskExecutor predeterminado
Asynctaskexecutor ejecutor = webasyncTask.getExecutor (); if (ejecutor! = Null) {this.taskExecutor = ejecutor;}Podemos configurar el grupo de subprocesos de Async sin especificarlo por separado para cada tarea
Especificar por configurador.setTaskExecutor (ThreadPoolTASKEXECUTOR ());
importar org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.concurrent.threadpooltaskexecutor; import; org.springframework.web.context.request.async.timeoutcallableProcessingInterceptor; import org.springframework.web.servlet.config.annotation.asyncsupportconfigurer; importar; org.springframework.web.servlet.config.annotation.webmvcconfigurationsUpport; @configurationPublic Public WebMVCConfig extiende WebMVCConfigurationsUpport {@Override public void ConfigureAsyCSupport (final ASYNCSUPPORTCONFIGURER) {Configurator. 1000l); configer.RegisterCallableInterceptors (TimeOutInterceptor ()); configer.setTASKEXECUTOR (ThreadPoolTASKEXECUTOR ()); } @Bean public TimeOutCallableProcessingInterceptor TimeOutInterceptor () {return New TimeOutCallableProcessingInterceptor (); } @Bean public ThreadPoolTASKEXECUTOR ThreadPoolTASKEXECUTOR () {ThreadPoolTaskExecutor t = new ThreadPoolTASKEXECUTOR (); T.SetCorepoolSize (10); T.SetMaxPoolSize (50); T.SetThreadNamePrefix ("YJH"); regresar t; }}Después de la configuración, puede ver que el nombre de subproceso de salida comienza con YJH, y no se crearán nuevos hilos todo el tiempo.
Puede ver el resultado de salida de la siguiente manera:
/El inicio de sesión se llama ID de subprocesos es: HTTP-NIO-8084-EXEC-1 Ejecución ID de subproceso es: YJH1
Resumir
Lo anterior es lo que el editor introdujo en Spring Boot utiliza WebAsyncTask para devolver los resultados de manera asincrónica. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!