Prefácio
Na série de tutoriais básicos da Spring Boot anterior, o artigo "Usando @async para implementar chamadas assíncronas no Spring Boot" foi introduzido como usar a anotação @async para implementar chamadas assíncronas. No entanto, o controle sobre essas execuções assíncronas é nossa habilidade básica em garantir a saúde de nossas próprias aplicações. Neste artigo, vamos saber se controlarmos a simultaneidade de chamadas assíncronas através de pools de threads personalizados.
Podemos modificar os exemplos deste artigo com base nos exemplos anteriores ou criar um novo projeto de inicialização da primavera para tentar.
Defina o pool de threads
A primeira etapa é definir um pool de threads na classe principal da inicialização da primavera, como:
@SpringbooTApplicationPublic Classe Application {public static void main (string [] args) {springapplication.run (application.class, args); } @Enableasync @configuration classe TaskPoolConfig {@Bean ("Taskexecutor") Executor público Taskexecutor () {threadpooltaskexecutor Executor = new Threadpooltaskexecutor (); executor.setCorePoolSize (10); executor.setMaxPoolSize (20); Executor.SetQueuecapacity (200); executor.setkeepaliveSeconds (60); Executor.setThreadNamePrefix ("Taskexecutor-"); Executor.SetRejectEdExecutionHandler (new ThreadPoolExecutor.CallerRunSpolicy ()); executor de retorno; }}}Acima, criamos um pool de threads usando o ThreadPooltaskexecutor e definimos os seguintes parâmetros:
Usando o pool de threads
Depois de definir o pool de threads, como fazemos com que as tarefas executadas de forma assíncrona sejam executadas usando os recursos neste pool de threads? O método é muito simples. Só precisamos especificar o nome do pool de threads na anotação @async, por exemplo:
@Slf4j@componentPublic Classe Task {public static aleatom Random = new Random (); @Async ("taskexecutor") public void Dotaskone () lança exceção {log.info ("Start Task One"); long start = system.currenttimemillis (); Thread.sleep (Random.NextInt (10000)); Long end = System.currenttimemillis (); log.info ("Tarefa completa um, tempo gasto:" + (end - start) + "milissegundos"); } @Async ("taskexecutor") public void Dotasktwo () lança a exceção {log.info ("start Task 2"); long start = system.currenttimemillis (); Thread.sleep (Random.NextInt (10000)); Long end = System.currenttimemillis (); log.info ("Tarefa completa 2, tempo gasto:" + (final - start) + "milissegundos"); } @Async ("taskexecutor") public void Dotaskthree () lança exceção {log.info ("Start Task Three"); long start = system.currenttimemillis (); Thread.sleep (Random.NextInt (10000)); Long end = System.currenttimemillis (); log.info ("Tarefa completa três, demorada:" + (end - start) + "milissegundos"); }}Teste de unidade
Finalmente, vamos escrever um teste de unidade para verificar
@Runwith (springjunit4classrunner.class) @springboottestpublic class ApplicationTests {@AUTOWIRED TARK PRIVADA TASK; @Test public void test () lança exceção {task.Dotaskone (); tarefa.Dotasktwo (); tarefa.Dotaskthree (); Thread.currentThread (). Junção (); }}Execute o teste de unidade acima, podemos ver no console que todos os nomes de threads de saída são prefixados pelo pool de threads que definimos antes, o que significa que nosso experimento usando o pool de threads para executar tarefas assíncronas foi bem -sucedido!
2018-03-27 22: 01: 15.620 Info 73703 --- [Taskexecutor-1] com.didispace.async.task: comece a fazer a tarefa um
2018-03-27 22: 01: 15.620 Info 73703 --- [Taskexecutor-2] com.didispace.async.task: Start Task 2
2018-03-27 22: 01: 15.620 Info 73703 --- [Taskexecutor-3] com.didispace.async.task: Start Tarefa Três
2018-03-27 22: 01: 18.165 Info 73703 --- [Taskexecutor-2] com.didispace.async.task: Tarefa completa 2, tempo necessário: 2545 milissegundos
2018-03-27 22: 01: 22.149 Info 73703 --- [Taskexecutor-3] com.didispace.async.task: Tarefa completa três, tempo necessário: 6529 milissegundos
2018-03-27 22: 01: 23.912 INFO 73703 --- [TASKEXECIENTO-1] COM.DIDISPACE.ASYNC.TASK: Tarefa completa um, tempo necessário: 8292 milissegundos
Exemplo completo:
Os leitores podem optar por visualizar o projeto Capítulo 4-1-3 conforme suas preferências:
Github: https://github.com/dyc87112/springboot-learning/
Gitee: https://gitee.com/diidispace/springboot-learning/
Download local: http://xiazai.vevb.com/201805/yuanma/springboot-learning(vevb.com).rar
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.