En el blog anterior, http://www.vevb.com/article/134866.htm Utilizamos la operación asincrónica del arranque de primavera. En ese momento, utilizamos el grupo de subprocesos predeterminado, pero si queríamos personalizar nuestro propio grupo de hilos de acuerdo con el proyecto, ¡hablemos sobre cómo personalizar el grupo de hilos!
1. Agregar clase de atributo de configuración
paquete com.chhliu.springboot.async.configuration; importar org.springframework.boot.context.properties.configurationProperties; @ConfigurationProperties (prefix = "Spring.task.pool") // Las ubicaciones de esta anotación se han habilitado. Ahora, mientras sea en el entorno, la clase pública TaskThreadPoolConfig {private int corePoolSize; privado int maxpoolSize; Private int KeepAliveSeconds; Private int queUecapacity; ……… omitir Getter, Método Setter ………}2. Crea una piscina de hilo
paquete com.chhliu.springboot.async.pool; import java.util.concurrent.executor; import java.util.concurrent.threadpoolexecutor; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration; importar org.springframework.scheduling.annotation.enableasync; importar org.springframework.scheduling.concurrent.threadpooltaskexecutor; import com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @Configuration @enableSync public class TaskExecUtePool {@aUtowired private taskthreadPoolConfig config; @Bean Public Executor myTaskasyncpool () {ThreadPoolTASKEXECUTOR Ejecutor = new ThreadPoolTASKEXECUTOR (); Ejecutor.setCorePoolSize (config.getCorePoolSize ()); Ejecutor.setMaxPoolSize (config.getMaxPoolSize ()); Ejecutor.setqueueCapacity (config.getqueueCapacity ()); Ejecutor.setkeepaliveSeconds (config.getkeepaliveSeconds ()); Ejecutor.setThreadNamePrefix ("myExecutor-"); //-Policía de rechazo: cómo manejar nuevas tareas cuando el grupo ha alcanzado el tamaño máximo // Caller_runs: no ejecute tareas en el nuevo hilo, pero ejecute ejecutor.setRectEdEdExeCutionHandler (new ThreadPoolExecutor.callerrunspolicy ()); ejecutor.initialize (); devolver ejecutor; }}3. Habilite el soporte de configuración en la clase principal
paquete com.chhliu.springboot.async; importar org.springframework.boot.springapplication; importar org.springframework.boot.autoconfigure.springbootapplication; importar org.springframework.boot.context.properties.enableconfigurationProperties; importar org.springframework.scheduling.annotation.enableasync; import com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @SpringBootApplication @enableSync @enableconfigurationProperties ({taskThreadPoolConfig.class}) // Habilitar las propiedades de configuración para admitir la clase pública SpringBootasynCapplication {public static void main (string [] arguments {springapplication.run (treingbootasyncappaplication.class, args); }}IV. Categoría de prueba
paquete com.chhliu.springboot.async.pool; importar org.slf4j.logger; importar org.slf4j.loggerFactory; importar org.springframework.scheduling.annotation.async; importar org.springframework.stereotype.component; @Component public class AsyncTask {protegido final logger logger = loggerFactory.getLogger (this.getClass ()); @Async ("mytaskasyncpool") // mytaskasyncpool es el nombre del método para configurar el grupo de subprocesos. Si no escribe el nombre del método del grupo de subprocesos personalizado aquí, el grupo de subprocesos predeterminado se usará public void dotask1 (int i) lanza interruptedException {logger.info ("tarea"+i+"iniciado"); }}V. Prueba
paquete com.chhliu.springboot.async; import java.util.concurrent.ExecutionException; importar org.junit.test; importar org.junit.runner.runwith; importar org.slf4j.logger; importar org.slf4j.loggerFactory; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.boot.test.context.springboottest; importar org.springframework.test.context.junit4.springrunner; import com.chhliu.springboot.async.pool.asynctask; @RunWith (SpringRunner.class) @SpringBoottest Public Class SpringBootAsynCapplicationTests {Logger de Logger final protegido = loggerFactory.getLogger (this.getClass ()); @Autowired private asynctask asyncTask; @Test public void asyncTaskTest () lanza interruptedException, ExecutionException {for (int i = 0; i <100; i ++) {asynctask.dotask1 (i); } logger.info ("Todas las tareas terminadas"); }}Los resultados de la prueba son los siguientes:
2017-03-20 20: 15: 15.208 Información 4068 --- [myExecutor-10] ccspringboot.async.pool.asynctask: Task60 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [MyExecutor-25] ccspringboot.async.pool.asynctask: Task61 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [MyExecutor-6] ccspringboot.async.pool.asynctask: Task62 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [MyExecutor-23] ccspringboot.async.pool.asynctask: Task63 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [MyExecutor-20] ccspringboot.async.pool.asynctask: Task64 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [myExecutor-19] ccspringboot.async.pool.asynctask: Task65 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [MyExecutor-16] ccspringboot.async.pool.asynctask: Task66 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [MyExecutor-15] ccspringboot.async.pool.asynctask: Task67 comenzó.
2017-03-20 20: 15: 15.208 Información 4068 --- [MyExecutor-12] ccspringboot.async.pool.asynctask: Task68 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [myExecutor-1] ccspringboot.async.pool.asynctask: tarea 69 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [MyExecutor-11] ccspringboot.async.pool.asynctask: Task81 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [MyExecutor-8] ccspringboot.async.pool.asynctask: Task82 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [MyExecutor-7] ccspringboot.async.pool.asynctask: Task83 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [MyExecutor-4] ccspringboot.async.pool.asynctask: Task84 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [MyExecutor-29] ccspringboot.async.pool.asynctask: Task85 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [MyExecutor-21] ccspringboot.async.pool.asynctask: Task86 comenzó.
2017-03-20 20: 15: 15.209 Información 4068 --- [MyExecutor-17] ccspringboot.async.pool.asynctask: Task88 comenzó.
¡Los resultados de las pruebas están bien!
6. Configure el grupo de subprocesos predeterminado
Si queremos usar el grupo de subprocesos predeterminado, pero solo queremos modificar la configuración del grupo de subprocesos predeterminado, ¿qué debemos hacer? En este momento, necesitamos implementar la clase AsyncConfigurer. El código de muestra es el siguiente:
import java.lang.reflect.method; import java.util.concurrent.executor; import java.util.concurrent.threadpoolexecutor; importar org.springframework.aop.interceptor.asyncunceughtExceptionHandler; importar org.springframework.beans.factory.annotation.aUtowired; importar org.springframework.context.annotation.configuration; importar org.springframework.scheduling.annotation.asyncconfigurer; importar org.springframework.scheduling.concurrent.threadpooltaskexecutor; import com.chhliu.cq.emailservice.threadconfiguration.taskthreadpoolconfig; import lombok.extern.slf4j.slf4j; / ** * NOTA: Este grupo de hilos es compartido por todas las tareas asincrónicas y no pertenece a una cierta tarea asíncrona * Descripción: grupo de subprocesos para configurar tareas asíncronas * @author chhliu * Tiempo de creación: 22 de mayo de 2017 a las 10:20:56 am * @version 1.2.0 */ @slf4j @configuration @AUTOWired private taskthreadPoolConfig config; // Para configurar la clase de propiedad, consulte el código anterior @Override public Ejecutor getAsynCExecutor () {ThreadPoolTASKEXECUTOR Ejecutor = new ThreadPoolTAsKExExeCutor (); Ejecutor.setCorePoolSize (config.getCorePoolSize ()); Ejecutor.setMaxPoolSize (config.getMaxPoolSize ()); Ejecutor.setqueueCapacity (config.getqueueCapacity ()); Ejecutor.setkeepaliveSeconds (config.getkeepaliveSeconds ()); Ejecutor.setThreadNamePrefix ("TaskExecutor-"); //-Policía de rechazo: cómo manejar nuevas tareas cuando el grupo ha alcanzado el tamaño máximo // Caller_runs: la tarea no se ejecuta en el nuevo hilo, pero el hilo donde se encuentra la persona que se encuentra ejecuta el ejecutor.setrejectedeCutionHandler (new ThreadPoolExeCutor.callerrunSpolicy ()); ejecutor.initialize (); devolver ejecutor; } @Override public asyncUncunceughtExceptionHandler getAsyncunceughedExceptionHandler () {// manejo de excepciones en tareas asíncronas Devuelve el nuevo asyncunceughtExceptionHandler () {@Override public Void HandleunceughedException (Throwable Arg0, Method Arg1, Object ... Arg2) { log.error("============================================================================================================= ============================================================== ================================================================ ============================================================== ================================================================ ============================================================== ================================================================Al usarlo, simplemente agregue @Async al método.
Resumir
Lo anterior es lo que le presentó el editor. Spring Boot utiliza un grupo de subprocesos personalizado para realizar tareas async. 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!