Dans le blog précédent, http://www.vevb.com/article/106718.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!
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 ………} 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; }} 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); }} 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é."); }} 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-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!
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.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.