Prefacio
En la serie de tutoriales básicos de Boot Spring Boot anteriores, el artículo "Usando @Async para implementar llamadas asíncronas en Spring Boot" se ha introducido cómo usar la anotación @async para implementar llamadas asincrónicas. Sin embargo, el control sobre estas ejecuciones asincrónicas es nuestra habilidad básica para garantizar la salud de nuestras propias aplicaciones. En este artículo, aprendamos si controlamos la concurrencia de las llamadas asincrónicas a través de grupos de subprocesos personalizados.
Podemos modificar los ejemplos en este artículo basados en los ejemplos anteriores, o crear un nuevo proyecto de arranque de primavera para probar.
Definir la piscina de hilos
El primer paso es definir un grupo de hilos en la clase principal de arranque de primavera, como:
@SpringBootApplicationPublic Aplolation {public static void main (string [] args) {springApplication.run (application.class, args); } @Enableasync @configuration class taskpoolConfig {@Bean ("TaskExecutor") ejecutor público taskExecutor () {ThreadPoolTaskExecutor Ejecutor = new ThreadPoolTaskExeCutor (); ejecutor.setCorepoolSize (10); ejecutor.setMaxPoolSize (20); ejecutor.setqueueCapacity (200); ejecutor.setkeepaliveSeconds (60); Ejecutor.setThreadNamePrefix ("TaskExecutor-"); Ejecutor.setRejedEdExecutionHandler (new ThreadPoolExecutor.CallerRunSpolicy ()); devolver ejecutor; }}}Arriba creamos un grupo de subprocesos utilizando ThreadPoolTaskExecutor y establecemos los siguientes parámetros:
Usando la piscina de hilos
Después de definir el grupo de subprocesos, ¿cómo hacemos que las tareas de ejecución llamadas de manera asincrónica se ejecuten usando los recursos en este grupo de hilos? El método es muy simple. Solo necesitamos especificar el nombre del grupo de subprocesos en la anotación @async, por ejemplo:
@Slf4j@componentPublic clase tarea {public static random Random = new Random (); @Async ("Taskexecutor") public void dotaskone () lanza la excepción {log.info ("Iniciar tarea uno"); Long Start = System.CurrentTimemillis (); Thread.sleep (Random.NextInt (10000)); Long End = System.CurrentTimemillis (); log.info ("Tarea completa uno, Tiempo tomado:" + (end - inicio) + "milisegundos"); } @Async ("taskexecutor") public void dotasktwo () lanza la excepción {log.info ("Iniciar tarea 2"); Long Start = System.CurrentTimemillis (); Thread.sleep (Random.NextInt (10000)); Long End = System.CurrentTimemillis (); log.info ("Tarea completa 2, Tiempo tomado:" + (End - Inicio) + "MilliseConds"); } @Async ("TaskExecutor") public void dotaskThree () lanza la excepción {log.info ("Inicie la tarea tres"); Long Start = System.CurrentTimemillis (); Thread.sleep (Random.NextInt (10000)); Long End = System.CurrentTimemillis (); log.info ("Tarea completa tres, consumir tiempo:" + (end - inicio) + "milisegundos"); }}Prueba unitaria
Finalmente, escribamos una prueba unitaria para verificarla
@Runwith (SpringJunit4ClassRunner.class) @SpringBoOttestPublic AplicationTests {@aUtoWired Tarea privada Tarea; @Test public void test () lanza la excepción {task.doTaskone (); task.DotaskTwo (); task.DotaskThree (); Thread.CurrentThread (). Join (); }}Realice la prueba unitaria anterior, podemos ver en la consola que todos los nombres de subprocesos de salida están prefijados por el grupo de subprocesos que definimos antes, lo que significa que nuestro experimento usando el grupo de subprocesos para realizar tareas asíncronas ha tenido éxito.
2018-03-27 22: 01: 15.620 Información 73703 --- [Taskexecutor-1] com.didispace.async.task: Comience a hacer la tarea uno
2018-03-27 22: 01: 15.620 Información 73703 --- [Taskexecutor-2] com.didispace.async.task: Inicie la tarea 2
2018-03-27 22: 01: 15.620 Información 73703 --- [Taskexecutor-3] com.didispace.async.task: Inicie la tarea tres
2018-03-27 22: 01: 18.165 Información 73703 --- [Taskexecutor-2] com.didispace.async.Task: Tarea completa 2, tiempo tomado: 2545 milisegundos
2018-03-27 22: 01: 22.149 Información 73703 --- [Taskexecutor-3] com.didispace.async.task: tarea completa tres, tiempo tomado: 6529 milisegundos
2018-03-27 22: 01: 23.912 INFO 73703 --- [Taskexecutor-1] com.didispace.async.task: Tarea completa uno, tiempo tomado: 8292 milisegundos
Ejemplo completo:
Los lectores pueden elegir ver el proyecto del Capítulo 4-1-3 según sus preferencias:
Github: https://github.com/dyc87112/springboot-lelarning/
Gitee: https://gitee.com/diidispace/springboot-lelarning/
Descarga local: http://xiazai.vevb.com/201805/yuanma/springboot-lelarning(vevb.com).rar
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.