No blog anterior, http://www.vevb.com/article/106718.htm usamos a operação assíncrona da bota de mola. Naquela época, usamos o pool de threads padrão, mas se quiséssemos personalizar nosso próprio pool de threads de acordo com o projeto, vamos falar sobre como personalizar o pool de threads!
pacote com.chhliu.springboot.async.configuration; importar org.springframework.boot.context.properties.configurationproperties; @ConfigurationProperties (prefix = "spring.task.pool") // Os locais desta anotação foram ativados. Agora, desde que esteja no ambiente, a classe pública TaskThreadPoolConfig {private int CorePoolSize; privado int maxpoolsize; private int keepaliveSegunds; private int queuecapacidade; ……… omita getter, método setter ………} pacote com.chhliu.springboot.async.pool; importar java.util.concurrent.executor; importar 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; importar com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @Configuration @enableasync public classe TaskexectectePool {@AUTOWIRED PRIVADO TASTHTHEADPOOLCOLCONFIG CONFIG; @Bean Public Executor mytaskasyncpool () {threadpooltaskexecutor Executor = new ThreadPooltaskexecutor (); Executor.SetCorePoolSize (config.getCorePoolSize ()); Execoror.SetMaxPoolSize (config.getMaxPoolSize ()); executor.setQueuecApacity (config.getQueuecApacity ()); Executor.setkeepaliveSeconds (config.getkeepaliveSeconds ()); executor.setThreadNamePrefix ("MyExecutor-"); // rejeição-policy: como lidar com novas tarefas quando o pool atingir o tamanho máximo // caller_runs: não execute tarefas no novo thread, mas execute executor.setRejecteExecutionHandler (novo threadpoolExecutor.callerRunSpolicy ()); executor.initialize (); executor de retorno; }} pacote 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; importar com.chhliu.springboot.async.configuration.taskthreadpoolconfig; @SpringbooTApplication @enableasync @enableConfigurationProperties ({TaskThreadPoolConfig.class}) // Ative Propriedades de configuração para apoiar a classe pública SpringBootasyncapplication {public static void main (string [] args) {springAppatication.run (springlication (springloots; }} pacote com.chhliu.springboot.async.pool; importar org.slf4j.logger; importar org.slf4j.loggerFactory; importar org.springframework.scheduling.annotation.async; importar org.springframework.tereotype.component; @Component public class AsyncTask {Protected Final Logger Logger = LoggerFactory.getLogger (this.getClass ()); @Async ("mytaskasyncpool") // mytaskasyncpool é o nome do método para configurar o pool de threads. Se você não escrever o nome do método do pool de threads personalizado aqui, o pool de threads padrão será usado public void Dotask1 (int i) lança interruptedException {Logger.info ("Task"+I+"iniciado."); }} pacote com.chhliu.springboot.async; importar 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; importar com.chhliu.springboot.async.pool.asynctask; @Runwith (springrunner.class) @springboottest classe pública SpringbootasyncplicationTests {Protected Final Logger Logger = LoggerFactory.getLogger (this.getClass ()); @Autowired Private AsyncTask AsyncTask; @Test public void assyncTaskTest () lança interruptedException, ExecutionException {for (int i = 0; i <100; i ++) {asynctask.dotask1 (i); } logger.info ("Todas as tarefas terminaram."); }} Os resultados dos testes são os seguintes:
2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecutor-10] ccspringboot.async.pool.asyncTask: Task60 foi iniciado. 2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecutor-25] ccspringboot.async.pool.asyncTask: Task61 foi iniciado. 2017-03-20 20: 15: 15.208 INFO 4068 --- [MyExecutor-6] ccspringboot.async.pool.asyncTask: Task62 foi iniciado. 2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecutor-23] ccspringboot.async.pool.asyncTask: Task63 foi iniciado. 2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecutor-20] ccspringboot.async.pool.asyncTask: Task64 Iniciado. 2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecutor-19] ccspringboot.async.pool.asyncTask: Task65 Iniciado. 2017-03-20 20: 15: 15.208 Info 4068 --- [MyExecutor-16] ccspringboot.async.pool.asyncTask: Task66 foi iniciado. 2017-03-20 20: 15: 15.208 INFO 4068 --- [MyExecutor-15] ccspringboot.async.pool.asyncTask: Task67 foi iniciado. 2017-03-20 20: 15: 15.208 INFO 4068 --- [MyExecutor-15] ccspringboot.async.pool.asyncTask: Task67 foi iniciado. 2017-03-20 20: 15: 15.208 INFO 4068 --- [MyExecutor-12] ccspringboot.async.pool.asyncTask: Task68 foi iniciado. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-1] ccspringboot.async.pool.asyncTask: Task69 Iniciado. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-11] ccspringboot.async.pool.asyncTask: Task81 foi iniciado. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-8] ccspringboot.async.pool.asyncTask: Task82 foi iniciado. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-7] ccspringboot.async.pool.asyncTask: Task83 foi iniciado. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-4] ccspringboot.async.pool.asyncTask: Task84 Iniciado. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-29] ccspringboot.async.pool.asyncTask: Task85 começou. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-21] ccspringboot.async.pool.asyncTask: Task86 foi iniciado. 2017-03-20 20: 15: 15.209 Info 4068 --- [MyExecutor-17] ccspringboot.async.pool.asyncTask: Task88 foi iniciado.
Os resultados dos testes estão ok!
Se quisermos usar o pool de threads padrão, mas apenas queremos modificar a configuração do pool de encadeamentos padrão, o que devemos fazer? No momento, precisamos implementar a classe AsyncConfigurer. O código de amostra é o seguinte:
importar java.lang.reflect.method; importar java.util.concurrent.executor; importar java.util.concurrent.threadpoolExecutor; importar org.springframework.aop.intercept.asyncuncaughtexceptionHandler; 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; importar com.chhliu.cq.emailservice.threadConfiguration.taskthreadpoolConfig; importar lombok.extern.slf4j.slf4j; / ** * Nota: Este pool de threads é compartilhado por todas as tarefas assíncronas e não pertence a uma determinada tarefa assíncrona * Descrição: Pool de threads para configurar tarefas assíncronas * @Author Chhliu * Horário de criação: 22 de maio de 2017 às 10:20:56 AMS * @Version 1.2.0 */ @slf4j Asyncconfigurer {@aUTowired Private TaskThreadPoolConfig Config; // Para configurar a classe Propriedade, consulte o código acima @Override Public Executor getasyncexEctor () {threadPooltaskexecutor Executor = new ThreadPoolTaskexecutor (); Executor.SetCorePoolSize (config.getCorePoolSize ()); Execoror.SetMaxPoolSize (config.getMaxPoolSize ()); executor.setQueuecApacity (config.getQueuecApacity ()); Executor.setkeepaliveSeconds (config.getkeepaliveSeconds ()); Executor.setThreadNamePrefix ("Taskexecutor-"); // rejeição-policy: como lidar com novas tarefas quando o pool atingir o tamanho máximo // caller_runs: a tarefa não é executada no novo thread, mas o thread em que o chamador está localizado executa executor.setRejeteExecutionHandler (new ThreadPoolexecutor.CallerRunSpolicy ()); executor.initialize (); executor de retorno; } @Override public AsyncuCaughtexceptionHandler getasyncuCaughtexceptionHandler () {// Manuseio de exceção em tarefas assíncronas retorna novo asyncuCaughtexceptionHandler () {@Override public void handlencughtexception (arg0 arg0, objeto, objeto ... Arg. log.error("============================================================================================================= ============================================================== =============================================================== ============================================================== =============================================================== ============================================================== =============================================================== Ao usá -lo, basta adicionar @async ao método.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.