En el blog anterior, http://www.vevb.com/article/106718.htm utilizamos la operación asincrónica de Spring Boot. 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!
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 ………} 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; }} 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); }} 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"); }} 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-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!
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.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.