В предыдущем блоге http://www.vevb.com/article/106718.htm мы использовали асинхронную работу пружинного загрузки. В то время мы использовали пул потоков по умолчанию, но если мы хотели настроить наш собственный пул потоков в соответствии с проектом, давайте поговорим о том, как настроить пул потоков!
пакет com.chhliu.springboot.async.configuration; Import org.springframework.boot.context.properties.configurationProperties; @ConfigurationProperties (prefix = "spring.task.pool") // Местоположения этой аннотации были включены. Теперь, пока это находится в окружающей среде, открытый класс TaskThreadPoolConfig {private int corepoolsize; private int maxpoolsize; частные int keepalivesconds; Частная int Queuecapacity; ……… опустить Getter, метод сеттера ………} пакет com.chhliu.springboot.async.pool; импортировать java.util.concurrent.executor; import java.util.concurrent.threadpoolexecutor; Импорт org.springframework.beans.factory.annotation.autowired; Импорт org.springframework.context.annotation.bean; Импорт org.springframework.context.annotation.configuration; Импорт org.springframework.scheduling.annotation.enableasync; Import org.springframework.scheduling.concurrent.treadpooltaskexecutor; Импорт com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @Configuration @enableasync public class taskexecutepool {@autowired private taskthreadpoolconfig config; @Bean Public Executor myTaskAsyncpool () {threadpooltaskexecutor executor = new ThreadpooltaskexeCutor (); executor.setCorePoolsize (config.getCorePoolsize ()); executor.setmaxpoolsize (config.getmaxpoolsize ()); executor.setqueuecapacity (config.getQueueCapacity ()); executor.sepekebealiveseconds (config.getkeepaliveSeconds ()); Исполнитель.setThreadNamePrefix ("myExeCutor-"); // отказ-policy: как выполнять новые задачи, когда пул достиг максимального размера // caller_runs: не выполнять задачи в новом потоке, но выполняйте исполнитель. SetreceeDexeCutionHandler (new ThreadPoolexeCutor.callerRunSpolicy ()); Исполнитель.initialize (); вернуть исполнитель; }} пакет com.chhliu.springboot.async; Импорт org.springframework.boot.springapplication; Импорт org.springframework.boot.autoconfigure.springbootapplication; Импорт org.springframework.boot.context.properties.enableConfigurationProperties; Импорт org.springframework.scheduling.annotation.enableasync; Импорт com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @Springbootapplication @enableasync @enableconfigurationproperties ({taskthreadpoolconfig.class}) // Включение свойств конфигурации для поддержки открытого класса Springbootasyncapplication {public Static void main (string [] args) {SpringApplication.Run (SpringBootAsyncapplication.class.class.class.class.class.class.class.class. }} пакет com.chhliu.springboot.async.pool; Импорт org.slf4j.logger; Импорт org.slf4j.loggerfactory; Импорт org.springframework.scheduling.annotation.async; Import org.springframework.stereotype.component; @Component public class asynctask {защищенный окончательный логист logger = loggerfactory.getLogger (this.getClass ()); @Async ("mytaskasyncpool") // mytaskasyncpool - это имя метода для настройки пула потоков. Если вы не напишите имя метода пользовательского пула потоков здесь, пул потоков по умолчанию будет использоваться public void dotask1 (int i) бросает прерванную эксплуатацию {logger.info («task»+i+«началось.»); }} пакет com.chhliu.springboot.async; Импорт java.util.concurrent.executionException; Импорт org.junit.test; Импорт org.junit.runner.runwith; Импорт org.slf4j.logger; Импорт org.slf4j.loggerfactory; Импорт org.springframework.beans.factory.annotation.autowired; Импорт org.springframework.boot.test.context.springboottest; Import org.springframework.test.context.junit4.springrunner; импорт com.chhliu.springboot.async.pool.asynctask; @Runwith (springrunner.class) @springboottest public class springbootasyncapplicationtests {защищенный окончательный logger logger = loggerfactory.getlogger (this.getClass ()); @Autowired private asynctask asynctask; @Test public void asynctasktest () бросает прерывания, выполняющий, executionException {for (int i = 0; i <100; i ++) {asynctask.dotask1 (i); } logger.info («Все задачи завершены»); }} Результаты теста следующие:
2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-10] CCSPringBoot.Async.pool.asynctask: Task60. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-25] CCSPringBoot.Async.pool.asynctask: Task61. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-6] CCSpringboot.Async.pool.asynctask: Task62. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-23] CCSPringBoot.Async.pool.asynctask: Task63. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-20] CCSPringBoot.Async.pool.asynctask: Task64. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-19] CCSPringboot.Async.pool.asynctask: Task65. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-16] CCSPringBoot.Async.pool.asynctask: Task66. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-15] CCSPringboot.Async.pool.asynctask: Task67. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-15] CCSPringboot.Async.pool.asynctask: Task67. 2017-03-20 20: 15: 15.208 Информация 4068 --- [MyExeCutor-12] CCSPringBoot.Async.pool.asynctask: Task68. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExeCutor-1] CCSPringboot.Async.pool.asynctask: Task69. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExeCutor-11] CCSPringBoot.Async.pool.asynctask: Task81. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExeCutor-8] CCSPringBoot.Async.pool.asynctask: Task82. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExeCutor-7] CCSPringBoot.Async.pool.asynctask: Task83. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExeCutor-4] CCSPringBoot.Async.pool.asynctask: Task84. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExecutor-29] CCSPringBoot.Async.pool.asynctask: Task85. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExeCutor-21] CCSPringBoot.Async.pool.asynctask: Task86. 2017-03-20 20: 15: 15.209 Информация 4068 --- [MyExeCutor-17] CCSPringBoot.Async.pool.asynctask: Task88.
Результаты теста в порядке!
Если мы хотим использовать пул потоков по умолчанию, но просто хотим изменить конфигурацию пула потоков по умолчанию, то что нам делать? В настоящее время нам нужно внедрить класс Asyncconfigurer. Пример кода заключается в следующем:
импортировать java.lang.reflect.method; импортировать java.util.concurrent.executor; import java.util.concurrent.threadpoolexecutor; Импорт org.springframework.aop.interceptor.asyncuncaughtexceptionHandler; Импорт org.springframework.beans.factory.annotation.autowired; Импорт org.springframework.context.annotation.configuration; импорт org.springframework.scheduling.annotation.asyncconfigurer; Import org.springframework.scheduling.concurrent.treadpooltaskexecutor; Импорт com.chhliu.cq.emailservice.threadconfiguration.taskthreadpoolconfig; импортировать lombok.extern.slf4j.slf4j; / ** * Примечание. Этот пул потоков разделяется всеми асинхронными задачами и не принадлежит определенной асинхронной задаче * Описание: Пул потоков для настройки асинхронных задач * @author chhliu * Время создания: 22 мая 2017 в 10:20:56 * @version 1.2.0 */ @@configuration Asyncconfigurer {@autowired private taskthreadpoolconfig config; // Чтобы настроить класс свойств, см. Приведенный выше код @Override Public Executor getAsyncexeCutor () {ThreadPoolTaskexeCutor executor = new ThreadPooltaskexeCutor (); executor.setCorePoolsize (config.getCorePoolsize ()); executor.setmaxpoolsize (config.getmaxpoolsize ()); executor.setqueuecapacity (config.getQueueCapacity ()); executor.sepekebealiveseconds (config.getkeepaliveSeconds ()); Исполнитель.setThreadNamePrefix ("taskexeCutor-"); // отказ-политика: как выполнять новые задачи, когда пул достиг максимального размера // caller_runs: задача не выполняется в новом потоке, но поток, где находится Caller, выполняет исполнитель.) Исполнитель.initialize (); вернуть исполнитель; } @Override public asyncuncaughtexceptionHandler getAsyncuncaughtexceptionHandler () {// Обработка исключений в асинхронных задачах Вернуть новые асинкункункофтексипные andhorl log.error ("========================================================================================================================= ===================================================================== ====================================================================== ===================================================================== ====================================================================== ===================================================================== ====================================================================== При его использовании просто добавьте @Async в метод.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.