Prefácio
Este artigo apresenta principalmente o conteúdo relevante sobre a chamada assíncrona da Spring Boot Integration para o Async. É compartilhado para sua referência e aprendizado. Não vou dizer muito abaixo, vamos dar uma olhada na introdução detalhada juntos.
O que é uma chamada assíncrona?
Chamadas assíncronas são relativas a chamadas síncronas. Chamadas síncronas referem -se ao programa que está sendo executado passo a passo em um pedido predeterminado. Cada etapa deve ser executada até que a etapa anterior seja executada. Chamadas assíncronas não precisam esperar que o programa anterior seja executado.
Método de processamento assíncrono
Como implementar chamadas assíncronas?
Multithreading é uma palavra -chave que muitas pessoas pensam a princípio. Sim, o Multithreading é uma maneira de implementar chamadas assíncronas.
Em projetos que não são de primavera, queremos implementar chamadas assíncronas para usar métodos de múltiplas fibras, podemos implementar a interface executável ou integrar a classe Thread ou usar o pool de threads executores fornecido pelo JDK1.5 ou acima.
O strngboot fornece uma maneira muito conveniente de executar chamadas assíncronas.
Siga o exemplo oficial
Insira o código
Dependências Maven:
<Parent> <puperiD> org.springframework.boot </frupid> <TRATIFACTID> Spring-boot-starter-parent </stutifactId> <Versão> 1.5.3.Release </sipers> </parent> </dependências> <pendency> <purgid> org.springFramework.Boot </Grupoid> Artift> </dependency> </dependências>
Inicie a aula: Adicione @enableasync Anotation
@SpringbooTApplication @enableasync public class Application {public static void main (string [] args) {springapplication.run (application.class, args); }}Controlador
Basta adicionar @async Anotation sobre o método que você precisa para executar assíncrono
@RestController @RequestMapping ("") Classe pública AsynctaskController {@RequestMapping ("") public String Dotask () lança interruptedException {long currentTimemillis = System.currenttimemillis (); this.Task1 (); this.Task2 (); this.Task3 (); long CurrentTimemillis1 = System.CurrentTimemillis (); Retornar "Tarefa Tarefa Tempo total consumido:"+(CurrentTimEmillis1-CurrentTimemillis)+"MS"; } @Async public void task1 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (1000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarefa1 Tarefa tempo consumida:"+(currenttimemillis1-currenttimemillis)+"ms"); } @Async public void task2 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (2000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Task2 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); } @Async public void task3 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (3000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarefa3 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); }}A função principal executa o projeto Spirngboot. Após a conclusão da startup, o navegador acessa: http: // localhost: 8080/
Console:
Tarefa1 Tarefa Tempo: 1012ms Tarefa2 Tarefa Horário: 2009ms Tarefa3 Tarefa Tempo: 3004ms
Depois de esperar um pouco, a saída é inserida:
Tempo total da tarefa: 6002ms
Assíncrono não executado!
Será que o código está escrito incorretamente? Eu verifiquei várias vezes e não encontrei erros óbvios. Lembro que a primavera também teve problemas semelhantes com a anotação @Transaction. Quando a mola digitaliza uma classe com o método de anotação @Transactional, uma classe de proxy é gerada e a classe de proxy inicia e fecha a transação. Na mesma classe, a chamada do método é executada no corpo da classe e a primavera não pode interceptar essa chamada de método.
De repente, coloque a tarefa assíncrona em uma classe separadamente e ajuste o código para entrar:
Controlador
@RequestMapping ("") @RestController Classe pública AsyncTaskController {@AUTOWIRED PRIVADO ASYNCTASK ASYNCTASK; @RequestMapping ("") public string Dotask () lança interruptedException {long currenttimemillis = system.currenttimemillis (); assínctask.task1 (); asynctask.task2 (); asynctask.task3 (); long CurrentTimemillis1 = System.CurrentTimemillis (); Retornar "Tarefa Tarefa total demorado:"+(currenttimemillis1-currenttimemillis)+"ms"; }} Classe de tarefas assíncronas
@Component public class AsyncTask {@async public void task1 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (1000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarefa1 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); } @Async public void task2 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (2000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Task2 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); } @Async public void task3 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (3000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarefa3 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); }}Console:
Tarefa1 Tarefa Tempo: 1012ms Tarefa2 Tarefa Horário: 2009ms Tarefa3 Tarefa Hora: 3004ms
Digite os resultados do navegador:
Tempo total da tarefa: 19ms
A chamada assíncrona foi bem -sucedida!
Como você sabe quando as três tarefas assíncronas são executadas e quais são os resultados da execução? Você pode usar o método de adicionar um retorno de chamada de Faather para julgar
O código é inserido:
Classe de tarefas assíncronas
@Component public class AsyncTask {@async public Future <String> task1 () lança interruptedException {long currenttimemillis = System.currenttimemillis (); Thread.sleep (1000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarefa1 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); devolver novo assíncrofult <string> ("A execução do Task1 é concluída"); } @Async public Future <String> task2 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (2000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Task2 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); devolver novo assíncrofult <string> ("A execução do Task2 é concluída"); } @Async public Future <String> task3 () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Thread.sleep (3000); long CurrentTimemillis1 = System.CurrentTimemillis (); System.out.println ("Tarefa3 Tarefa demorada:"+(currentTimemillis1-CurrentTimemillis)+"MS"); devolver nova assíncresult <string> ("execução de tarefas3 concluída"); }} Controlador
@RequestMapping ("") @RestController Classe pública AsyncTaskController {@AUTOWIRED PRIVADO ASYNCTASK ASYNCTASK; @RequestMapping ("") public string Dotask () lança interruptedException {long currenttimemillis = system.currenttimemillis (); Future <String> tarefa1 = asynctask.task1 (); Future <String> task2 = asynctask.task2 (); Future <String> tarefa3 = asynctask.task3 (); Resultado da string = null; para (;;) {if (task1.isdone () && task2.isdone () && task3.isdone ()) {// Todas as três tarefas são chamadas para concluir, sair do loop e aguardar o intervalo; } Thread.sleep (1000); } long currenttimemillis1 = System.CurrentTimEmillis (); resultado = "total demorado de tarefas:"+(currenttimemillis1-currenttimemillis)+"ms"; resultado de retorno; }}Saída do console:
Tarefa1 Tarefa Horário: 1000ms Tarefa2 Tarefa Horário: 2001ms Tarefa3 Tarefa Tempo: 3001ms
Saída do navegador:
Tempo total da tarefa: 4015ms
A chamada assíncrona é bem -sucedida e o programa retorna o resultado apenas quando todas as tarefas são concluídas!
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.