Préface
Cet article présente principalement le contenu pertinent sur l'appel asynchrone de Spring Boot Integration à Async. Il est partagé pour votre référence et votre apprentissage. Je ne dirai pas beaucoup ci-dessous, jetons un coup d'œil à l'introduction détaillée ensemble.
Qu'est-ce qu'un appel asynchrone?
Les appels asynchrones sont relatifs aux appels synchrones. Les appels synchrones se réfèrent à l'exécution du programme étape par étape dans un ordre prédéterminé. Chaque étape doit être exécutée jusqu'à l'exécution de l'étape précédente. Les appels asynchrones n'ont pas besoin d'attendre l'exécution du programme précédent.
Méthode de traitement asynchrone
Comment implémenter les appels asynchrones?
Le multithreading est un mot clé auquel beaucoup de gens pensent au début. Oui, le multithreading est un moyen d'implémenter les appels asynchrones.
Dans les projets non spring, nous voulons implémenter les appels asynchrones consistent à utiliser des méthodes multi-lancers, nous pouvons implémenter l'interface gérée par nous-mêmes ou intégrer la classe de threads, ou utiliser le pool de threads exécuteurs fourni par JDK1.5 ou plus.
Strngboot fournit un moyen très pratique d'exécuter des appels asynchrones.
Suivez l'exemple officiel
Entrez le code
Dépendances Maven:
<parent> <proupId> org.springframework.boot </rombasid> <ArtifactId> Spring-boot-starter-Parent </letefactid> <in version> 1.5.3. </dpendance> </dpendances>
Démarrez la classe: ajoutez @enableasync annotation
@Springbootapplication @enableasync public class application {public static void main (String [] args) {springApplication.run (application.class, args); }}Contrôleur
Ajoutez simplement une annotation @async sur la méthode dont vous avez besoin pour exécuter de manière asynchrone
@RestController @RequestMapping ("") classe publique AsyncTaskController {@RequestMapping ("") public String dotask () lance InterruptedException {long currentTimemillis = System.CurrentImmillis (); this.task1 (); this.task2 (); this.task3 (); Long CurrentTimeMillis1 = System.CurrentTimemillis (); Retour "Tâche Tâche Temps total consommé:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"; } @Async public void task1 () lève InterruptedException {long currentTimeMillis = System.currentTimeMillis (); Thread.Sleep (1000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task1 Task Temps consommé:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); } @Async public void task2 () lève InterruptedException {long currentTimeMillis = System.currentTimemillis (); Thread.Sleep (2000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task2 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); } @Async public void task3 () lève InterruptedException {long currentTimeMillis = System.currentTimemillis (); Thread.Sleep (3000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task3 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); }}La fonction principale exécute le projet Spirngboot. Une fois le démarrage terminé, le navigateur accède: http: // localhost: 8080 /
Console:
Tâche1 Temps Tâche: 1012 ms Tâche2 Tâche Tâche: 2009ms Tâche3 Tâche Tâche: 3004ms
Après avoir attendu un certain temps, la sortie est entrée:
Temps de tâche total: 6002 ms
Asynchrone non exécuté!
Se pourrait-il que le code soit mal écrit? Je l'ai vérifié plusieurs fois et je n'ai trouvé aucune erreur évidente. Je me souviens que le printemps a également eu des problèmes similaires avec l'annotation @transactionnelle. Lorsque Spring scanne une classe avec @Transactional Annotation Method, une classe de proxy est générée et la classe de proxy démarre et ferme la transaction. Dans la même classe, l'appel de méthode est exécuté dans le corps de la classe et Spring ne peut pas intercepter cet appel de méthode.
Soudain, mettez séparément la tâche asynchrone dans une classe et ajustez le code pour entrer:
Contrôleur
@RequestMapping ("") @RestController public class asyncTaskController {@Autowired private asyncTask asyncTask; @RequestMapping ("") public String dotask () lève InterruptedException {long currentTimeMillis = System.CurrentTimeMillis (); asynctask.task1 (); asynctask.task2 (); asynctask.task3 (); Long CurrentTimeMillis1 = System.CurrentTimemillis (); Retour "Tâche de tâche totale chronométrant:" + (currentTimeMillis1-Currenttimemillis) + "MS"; }} Classe de tâches asynchrones
@Component public class asyncTask {@async public void task1 () lève InterruptedException {long currentTimemillis = System.currentTimemillis (); Thread.Sleep (1000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task1 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); } @Async public void task2 () lève InterruptedException {long currentTimeMillis = System.currentTimemillis (); Thread.Sleep (2000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task2 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); } @Async public void task3 () lève InterruptedException {long currentTimeMillis = System.currentTimemillis (); Thread.Sleep (3000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task3 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); }}Console:
Tâche1 Temps Tâche: 1012 ms Tâche2 Tâche Tâche: 2009ms Tâche3 Tâche Tâche: 3004ms
Entrez les résultats du navigateur:
Temps de tâche total: 19 ms
L'appel asynchrone a réussi!
Comment savez-vous quand les trois tâches asynchrones sont exécutées et quels sont les résultats de l'exécution? Vous pouvez utiliser la méthode pour ajouter un rappel FAATURE pour juger
Le code est entré:
Classe de tâches asynchrones
@Component public class asyncTask {@async public future <string> task1 () lève interruptedException {long currentTimemillis = System.currenttimemillis (); Thread.Sleep (1000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task1 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); return new AsynCresult <string> ("Exécution de tâche1 est terminée"); } @Async public Future <string> task2 () lève InterruptedException {long currentTimeMillis = System.CurrentTimeMillis (); Thread.Sleep (2000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task2 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); return new AsynCresult <string> ("l'exécution de la tâche2 est terminée"); } @Async Public Future <string> task3 () lance InterruptedException {long currentTimeMillis = System.CurrentTimeMillis (); Thread.Sleep (3000); Long CurrentTimeMillis1 = System.CurrentTimemillis (); System.out.println ("Task3 Task Consommation de la tâche:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"); return new AsynCresult <string> ("Exécution de tâche3 terminée"); }} Contrôleur
@RequestMapping ("") @RestController public class asyncTaskController {@Autowired private asyncTask asyncTask; @RequestMapping ("") public String dotask () lève InterruptedException {long currentTimeMillis = System.CurrentTimeMillis (); Futur <string> task1 = asynctask.task1 (); Futur <string> task2 = asynctask.task2 (); Futur <string> task3 = asynctask.task3 (); Résultat de chaîne = null; for (;;) {if (task1.isdone () && task2.isdone () && task3.isdone ()) {// Les trois tâches sont appelées pour terminer, quittent la boucle et attendez la pause; } Thread.sleep (1000); } Long CurrentTimeMillis1 = System.CurrentTimeMillis (); Result = "Total prend le temps des tâches:" + (CurrentTimeMillis1-Currenttimemillis) + "MS"; Résultat de retour; }}Sortie de la console:
Tâche1 Tâche Tâche: 1000 ms Tâche2 Tâche Tâche: 2001 ms Tâche3 Tâche Tâche: 3001 ms
Sortie du navigateur:
Temps de tâche total: 4015 ms
L'appel asynchrone est réussi et le programme renvoie le résultat uniquement lorsque toutes les tâches sont terminées!
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.