Antes de usar a Spring Boot, nossa abordagem era definir um pool de tarefas no arquivo de configuração e, em seguida, lançar a tarefa anotada @async no pool de tarefas para execução. Portanto, na inicialização da primavera, como implementar chamadas de tarefas assíncronas, o método é mais simples.
Vamos combinar o anterior
Spring Boot Integrated JMS (implementação do ActiveMQ)
O código deste blog é implementado.
1. Descrição da função
Quando um consumidor ouve uma mensagem na fila, ele ou ela processa a tarefa que recebe a mensagem como uma tarefa assíncrona.
2. Modificação de código
Consumidor 1:
pacote com.chhliu.springboot.jms; importar org.springframework.jms.annotation.jmslistener; importar org.springframework.scheduling.annotation.async; importar org.springframework.tereotype.component; @Component public class Consumer {@jmsListener (Destination = "myTest.queue") @async // Este método será executado de forma assíncrona, o que significa que o encadeamento principal pulará o método diretamente, mas use o encadeamento no thread para executar o método public void (text) {system.out.printltnnn (thread para executar o método public void (string text) {system.out.printlnt (shread.PrintLn (thread para executar o método public void (string text) {system.out.printlnn (shread. é: "+texto); }}Consumidor 2:
pacote com.chhliu.springboot.jms; importar org.springframework.jms.annotation.jmslistener; importar org.springframework.messaging.handler.annotation.sendto; importar org.springframework.tereotype.component; @Component public class Consumer2 {@jmsListener (Destination = "mytest.queue") @sendto ("out.queue") public String ReceberQueue (String text) {System.out.println (thread.currentThread (). GetName ()+": a mensagem recebida pelo consumidor2 é:"+text); retornar "Mensagem de retorno"+texto; }}Adicione a anotação a seguir à classe de teste:
pacote com.chhliu.springboot.jms; importar javax.jms.Destination; importar org.apache.activemq.command.activemqqueue; importar org.junit.test; importar org.junit.runner.runwith; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.boot.test.context.springboottest; importar org.springframework.scheduling.annotation.enableasync; importar org.springframework.test.context.junit4.springrunner; @Runwith (springrunner.class) @springboottest @enableasync // habilite tarefas assíncronas para apoiar a classe pública SpringbootjmsApplicationTests {@Autowired Privater Producer Produtora; @Test public void contextLoads () lança interruptedException {Destination Destination = new ActiveMQQueue ("mytest.queue"); para (int i = 0; i <100; i ++) {produtor.sendMessage (destino, "myName é chhliu !!!"); }}} 3. Resultados dos testes
DefaultMessageListEnerContainer-1: Consumer2 recebe: MyName é chhliu !!! A mensagem de resposta recebida da fila de aquecimento é: Return messageMyname é chhliu !!! Simplateasynctaskexecutor-45: A mensagem recebida pelo consumidor é: MyName é chhliu !!! DefaultMessageListEnerContainer-1: Consumer2 recebe: MyName é chhliu !!! A mensagem de resposta recebida da fila de aquecimento é: Return messageMyname é chhliu !!! Simplateasynctaskexecutor-46: A mensagem recebida pelo consumidor é: MyName é chhliu !!! DefaultMessageListEnerContainer-1: A mensagem recebida pelo Consumer2 é: MyName é Chhliu !!! A mensagem de resposta recebida da fila de aquecimento é: Return messageMyname é chhliu !!! Simplateasynctaskexecutor-47: A mensagem recebida pelo consumidor é: MyName é chhliu !!! DefaultMessageListEnerContainer-1: A mensagem recebida pelo Consumer2 é: MyName é Chhliu !!! A mensagem de resposta recebida da fila de aquecimento é: Return messageMyname é chhliu !!! Simplateasynctaskexecutor-48: A mensagem recebida pelo consumidor é: MyName é chhliu !!! DefaultMessageListEnerContainer-1: Consumer2 é: MyName é chhliu !!! A mensagem de resposta recebida da fila de aquecimento é: Return messageMyname é chhliu !!! Simplateasynctaskexecutor-49: A mensagem recebida pelo consumidor é: MyName é chhliu !!! DefaultMessageListEnerContainer-1: A mensagem recebida pelo Consumer2 é: MyName é Chhliu !!! A mensagem de resposta recebida da fila de aquecimento é: Return messageMyname é chhliu !!! Simplateasynctaskexecutor-50: A mensagem recebida pelo consumidor é: MyName é chhliu !!! DefaultMessageListEnerContainer-1: A mensagem recebida pelo Consumer2 é: MyName é Chhliu !!!
A partir dos resultados do teste acima, podemos ver que, como o consumidor 2 não usa o método de tarefa assíncrona, o consumidor 2 consome mensagens é processado pelo encadeamento fixo DefaultMessageListEnerContainer-1. O consumidor 1 usa o método de tarefa assíncrona e cada vez que a mensagem recebida é processada por um encadeamento diferente. Quando a mensagem é recebida, a tarefa é lançada diretamente no pool de tarefas para processamento e o thread principal continua sendo executado. Também pode ser inferido a partir dos resultados do teste que a Spring Boot usa o pool de threads NewCachedThreadpool por padrão.
Para um uso específico de pools de threads, consulte outra postagem de blog minha: //www.vevb.com/article/134870.htm
4. Tarefas assíncronas retornaram
No desenvolvimento real, geralmente encontramos situações em que as tarefas assíncronas retornam. Então, como o implementamos no Spring Boot?
A seguir, é apresentado um exemplo de e -mail assíncrono como uma descrição. O código de exemplo é o seguinte:
@Async ("taskexecectepool") // A tarefa assíncrona será enviada ao pool de tarefas TaskexEcteCool para executar public futuro <swer Respons> dondemil (Mailinfo MailInfo) {// The Themek A Thound Returns, use Future <swert> toneread (AsaNously Return Log.inofo O método assíncrono do doil -correio foi chamado! "); Sessão sendmailSession = null; Resposta res = nova resposta (); boolean iSok = sendEmail (Mailinfo); // O método específico de enviar e -mails se (isok) {res.SetSuccess (true); } else {res.SetSuccess (false); } retornar novo Asyncresult <swerwer> (res);Como usá -lo depois de retornar? O código de amostra é o seguinte:
Future <swer Respot> resultado = taskJob.DOSENDEMAIL (MailInfo); res = resultado.get (6, timeUnit.SECONDS);
Dessa forma, você pode obter o retorno da tarefa assíncrona!
Resumir
O exposto acima é o método de implementação do Spring Boot Assíncrono (ASYNC) Agendamento de tarefas introduzido para você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!