Dans le blog précédent, http://www.vevb.com/article/134866.htm, nous avons utilisé le fonctionnement asynchrone de Spring Boot. À ce moment-là, nous avons utilisé le pool de threads par défaut, mais si nous voulions personnaliser notre propre pool de threads en fonction du projet, parlons de la façon de personnaliser le pool de threads!
1. Ajouter une classe d'attribut de configuration
package com.chhliu.springboot.async.configuration; import org.springframework.boot.context.properties.configurationProperties; @Configurationproperties (prefix = "spring.task.pool") // Les emplacements de cette annotation ont été activés. Maintenant, tant qu'il est dans l'environnement, la classe publique TaskThreadPoolConfig {private int corepoolSize; privé int maxpoolSize; private int keepaliveseconds; private int queuecapacity; ……… omettre Getter, méthode du setter ………}2. Créez un pool de threads
package com.chhliu.springboot.async.pool; import java.util.concurrent.executor; import java.util.concurrent.threadpoolExecutor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.annotation.enableasync; import org.springframework.scheduling.concurrent.threadpooltaskexecutor; import com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @Configuration @enableasync public class taskexcutepool {@autowired private taskthreadpoolconfig config; @Bean Public Executeur MyTaskasyncPool () {ThreadPoolTaskExECUTOR Executor = new ThreadPoolTasKExEcutor (); Executor.SetCorePoolSize (config.getCorePoolSize ()); Executor.SetMaxPoolSize (config.getMaxPoolSize ()); Executor.SetQueUeCapacity (config.getQueUeCapacity ()); EMECTOR.SETHEETHEAGELIVESECONDS (config.getKeepalivesEconds ()); Executor.SetThreadNamePrefix ("MyExecUtor-"); // Rejection-Policy: Comment gérer les nouvelles tâches lorsque le pool a atteint Max Size // CALLER_RUNS: N'exécutez pas de tâches dans le nouveau thread, mais exécutez Executor.SetRejectEdexEcutionHandler (new ThreadPoolExecutor.CallerRunSpolicy ()); exécuteur.Initialize (); return exécuteur; }}3. Activer la prise en charge de la configuration dans la classe principale
package com.chhliu.springboot.async; import org.springframework.boot.springApplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.boot.context.properties.enableConfigurationProperties; import org.springframework.scheduling.annotation.enableasync; import com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @Springbootapplication @enableasync @enableConfigurationProperties ({taskthreadpoolconfig.class}) // Activer les propriétés de configuration pour soutenir la classe publique Springbootasyncapplication {public static void main (string [] args) {springapplication.run (SpringbootasyncApplication.class, args); }}Iv. Catégorie de test
package com.chhliu.springboot.async.pool; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.scheduling.annotation.async; import org.springframework.sterereotype.Component; @Component public class ASYNCTASK {Protected Final Logger Logger = LoggerFactory.getLogger (this.getClass ()); @Async ("mytaskasyncpool") // mytaskasyncpool est le nom de la méthode pour configurer le pool de threads. Si vous n'écrivez pas le nom de la méthode du pool de thread personnalisé ici, le pool de thread par défaut sera utilisé public void dotask1 (int i) lance InterruptedException {logger.info ("tâche" + i + "démarré."); }}V.
package com.chhliu.springboot.async; Importer java.util.concurrent.executionException; import org.junit.test; import org.junit.runner.runwith; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.springboottest; import org.springframework.test.context.junit4.springrunner; import com.chhliu.springboot.async.pool.asyncTask; @Runwith (springrunner.class) @springboottest public class springbootasyncapplicationtests {protected final logger logger = loggerfactory.getLogger (this.getClass ()); @Autowired Private AsyncTask AsyncTask; @Test public void asyncTaskTest () lève InterruptedException, ExecutionException {for (int i = 0; i <100; i ++) {asynctask.dotask1 (i); } logger.info ("Toutes les tâches terminées."); }}Les résultats des tests sont les suivants:
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-10] CCSpringboot.async.pool.asyncTask: Task60 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-25] CCSpringboot.async.pool.asynctask: Task61 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-6] CCSpringboot.async.pool.asynctask: Task62 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-23] CCSpringboot.async.pool.asynctask: Task63 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-20] CCSpringboot.async.pool.asynctask: Task64 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-19] CCSpringboot.async.pool.asynctask: Task65 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-16] CCSpringboot.async.pool.asynctask: Task66 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-15] CCSpringboot.async.pool.asynctask: Task67 a démarré.
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecUtor-12] CCSpringboot.async.pool.asynctask: Task68 a démarré.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-1] CCSpringboot.async.pool.asynctask: tâche69 démarrée.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecUtor-11] CCSpringboot.async.pool.asynctask: tâche81 démarré.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-8] CCSpringboot.async.pool.asynctask: tâche82 démarré.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-7] CCSpringboot.async.pool.asynctask: tâche83 démarré.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecUtor-4] CCSpringboot.async.pool.asynctask: tâche84 démarré.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecUtor-29] Ccspringboot.async.pool.asynctask: tâche85 démarré.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecUtor-21] CCSpringboot.async.pool.asynctask: tâche86 démarré.
2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-17] CCSpringboot.async.pool.asynctask: tâche88 démarré.
Les résultats des tests sont OK!
6. Configurer le pool de threads par défaut
Si nous voulons utiliser le pool de threads par défaut, mais que nous voulons simplement modifier la configuration du pool de thread par défaut, que devons-nous faire? Pour le moment, nous devons implémenter la classe AsyncConfigurer. L'exemple de code est le suivant:
import java.lang.reflect.method; import java.util.concurrent.executor; import java.util.concurrent.threadpoolExecutor; import org.springframework.aop.interceptor.asyncuncaughtexceptionHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.annotation.asyncconfigurer; import org.springframework.scheduling.concurrent.threadpooltaskexecutor; import com.chhliu.cq.emailservice.threadconfiguration.taskThreadPoolConfig; Importer lombok.extern.slf4j.slf4j; / ** * Remarque: Ce pool de threads est partagé par toutes les tâches asynchrones et n'appartient pas à une certaine tâche asynchrone * Description: Pool de thread pour configurer les tâches asynchrones * @author chhliu * Temps de création: 22 mai 2017 à 10:20:56 AM * @version 1.2.0 * / @ Slf4j @configuration AsyncConfigurer {@autowired private taskthreadpoolconfig config; // Pour configurer la classe de propriétés, consultez le code ci-dessus @Override public Executor GetaSyNExECUTOR () {ThreadPoolTasKexECUTOR EMEMPOROR = new ThreadPoolTasKexECUTOR (); Executor.SetCorePoolSize (config.getCorePoolSize ()); Executor.SetMaxPoolSize (config.getMaxPoolSize ()); Executor.SetQueUeCapacity (config.getQueUeCapacity ()); EMECTOR.SETHEETHEAGELIVESECONDS (config.getKeepalivesEconds ()); EMECTOR.SetThreadNamePrefix ("TaskExEcutor-"); // Rejection-Policy: Comment gérer les nouvelles tâches lorsque le pool a atteint Max Size // CALLER_RUNS: La tâche n'est pas exécutée dans le nouveau thread, mais le thread où l'appelant est situé exécute Executor.SetRejectEdExecutionHandler (nouveau ThreadPoolExecutor.CalleRrunSpolicy ()); exécuteur.Initialize (); return exécuteur; } @Override public asynCuncaughtexceptionHandler getasynCuncaughtexceptionHandler () {// exception maniement dans les tâches asynchrones renvoie de nouveaux asyncuncaughtexceptionhandler () {@Override public vide handleuncaughtexception (lowable arg0, méthode arg1, objet ... arg2) { log.error("============================================================================================================= =====================================================================. ======================================================================. =====================================================================. ======================================================================. =====================================================================. ======================================================================.Lorsque vous l'utilisez, ajoutez simplement @async à la méthode.
Résumer
Ce qui précède est ce que l'éditeur vous a présenté. Spring Boot utilise un pool de thread personnalisé pour effectuer des tâches asynchrones. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!