Springboot utilise asynchrone le principe @ async et la configuration du pool de threads

Kenx 2021-09-15 07:13:29
springboot utilise asynchrone le principe


Préface

Dans le développement de projets réels, de nombreux scénarios d'affaires doivent être réalisés de façon asynchrone,Comme un avis de message,Logging,Et tout ce qui est très commun peut être fait asynchrone,Amélioration de l'efficacité,Alors, dansSpringComment utiliser l'asynchrone dans le cadre

Utiliser les étapes

Il y a généralement deux façons de terminer une opération asynchrone,File d'attente des messagesMQ,EtTraitement du pool de threadsThreadPoolExecutor

EtSpring4Les paires fournies dansThreadPoolExecutorPool de Threads encapsulésThreadPoolTaskExecutor,Activer directement avec les annotations@Async,Cette note nous permet d'utiliserSpringIl est très pratique de faire des opérations asynchrones

Configurer la configuration des paramètres de la classe threadpool

Classe constante personnalisée

public class ConstantFiledUtil { public static final String AUTHORIZATION_TOKEN = "authorizationToken"; /** * kmallNom du pool de threads */ public static final String KMALL_THREAD_POOL = "KmallThreadPool"; /** * kmallPréfixe du nom du fil */ public static final String KMALL_THREAD_NAME_PREFIX = "kmall-thread-";}

Configurer le pool de Threads

@Configuration(proxyBeanMethods = false)@EnableAsync //Ouvrir l'annotationpublic class KmallConfig { @Bean(ConstantFiledUtil.KMALL_THREAD_POOL) public ThreadPoolTaskExecutor FebsShiroThreadPoolTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //Configurer le nombre de fils de base executor.setCorePoolSize(5); //Configurer le nombre maximum de Threads executor.setMaxPoolSize(20); //Configurer la taille de la file d'attente executor.setQueueCapacity(200); //Temps libre autorisé pour les Threads de maintenance de pool de Threads executor.setKeepAliveSeconds(30); //Configurer le préfixe de nom du thread dans le pool de Threads executor.setThreadNamePrefix(ConstantFiledUtil.KMALL_THREAD_NAME_PREFIX); //Attendez que toutes les tâches soient terminées avant de continuer à détruire les autresBean executor.setWaitForTasksToCompleteOnShutdown(true); //Définir le temps d'attente des tâches dans le pool de Threads,Si la destruction n'a pas eu lieu au - delà de ce délai,Pour s'assurer que l'application peut enfin être fermée,Au lieu de bloquer executor.setAwaitTerminationSeconds(60); // rejection-policy:QuandpoolAtteintmax sizeQuand,Comment gérer une nouvelle tâche // CALLER_RUNS:Ne pas exécuter la tâche dans le nouveau thread,Il est plutôt exécuté par le thread de l'appelant executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //Effectuer l'initialisation executor.initialize(); return executor; }}

Notez qu'il faut passer ici@EnableAsyncActiver asynchrone sinon invalide

Tâches de filetage personnalisées

public interface ILogService extends IService<Log> { /** * Recherche de pages recherche d'informations sur le journal de requête * @param logParams * @return */ IPage getSearchLogByPage(SearchLogParams logParams); /** * Enregistrer le journal * * @param logSubject */ @Async void saveLog(LogSubject logSubject);}

Lorsque l'exécution asynchrone est nécessaireInterface,OuMéthodesAjouter@AsyncNote cette méthode est asynchrone,Appelé dans le programme principal,C'est une façon asynchrone d'exécuter un seul thread

Cette note indique quesaveLogLa méthode entre dans le pool de Threads qui estKmallThreadPoolCréé par la méthode.

Nous pouvons également spécifier le nom de la méthode séparément@Async("saveLogs")

De cette façon, lors de la journalisation, un seul thread exécute chaqueDemandeTout a répondu rapidement,Et les opérations longues sont laissées aux Threads dans le pool de Threads pour l'exécution asynchrone

Résumé

SpringUtilisation [email protected] annoter le marquage,Appelée méthode asynchrone.Inspring bootUtilisé dans l'[email protected]'est simple.:

  1. Appeler une classe de méthode asynchrone ou démarrer une classe avec des [email protected]
  2. En plus de la méthode qui doit être appelée [email protected]
  3. Utilisé@AsyncL'objet de classe de la méthode d'annotation doit êtreSpringGestion des conteneursbeanObjet;

Notez que l'invocation d'une méthode asynchrone dans la même classe n'est pas valide:Raison l'appel de méthode dans la classe par défaut ne sera pasaopInterception,C'est - à - dire que l'appelant et l'appelant sont dans la même classe,Il n'y a pas de tangente,L'objet n'a pas étéSpringGestion des conteneurs.C'est - à - dire:@AsyncMéthode non valable

Solutions:

Si vous voulez que les appels entre les méthodes de la même classe soient également interceptés,À utiliserspringObjet d'instance dans le conteneur,Au lieu d'utiliser par défautthis,Parce que passerbeanL'appel de l'instance seraspringDeaop Intercepter la méthode d'utilisation de cet exemple :AsyncService asyncService = context.getBean(AsyncService.class); Ensuite, utilisez cette référence pour appeler la méthode locale pour atteindre l'objectif d'interceptionRemarques:Cette méthode ne peut intercepter queprotected,default,publicMéthodes,privateLa méthode n'a pas pu intercepter.C'est...spring aopUn mécanisme.

Analyse des principes

Il ne peut y avoir que deux types de retour de méthode asynchrone:

  1. Lorsque le type de retour estvoidQuand,Les exceptions générées par la procédure d'appel de méthode ne sont pas lancées au niveau de l'appelant,Vous pouvez le faire en notantAsyncUncaughtExceptionHandlerPour capturer ce genre d'exception

  2. Lorsque le type de retour estFutureQuand,L'exception générée par la procédure d'appel de méthode est lancée au niveau de l'appelant

Notez que si vous ne Personnalisez pas les pools de Threads pour les méthodes asynchrones, ils sont utilisés par défautSimpleAsyncTaskExecutor.SimpleAsyncTaskExecutor:Pas un vrai pool de Threads,Cette classe ne réutilise pas les fils,Chaque appel crée un nouveau thread.Quand la concurrence est grandeProblèmes de performance graves.

SpringInterface de pool de thread asynchrone TaskExecutor

Voir le code source

@FunctionalInterfacepublic interface TaskExecutor extends Executor { void execute(Runnable var1);}

Il y a beaucoup de ses vraies classes primitives comme suit:

SpringBootUtilisation asynchrone@Async Principes et configuration du pool de Threads

  1. SimpleAsyncTaskExecutor:Pas un vrai pool de Threads,Cette classe ne réutilise pas les fils,Chaque appel crée un nouveau thread.

  2. SyncTaskExecutor:Cette classe n'implémente pas d'appels asynchrones,Juste une opération de synchronisation.Uniquement pour les endroits où le Multithreading n'est pas nécessaire

  3. ConcurrentTaskExecutor:ExecutorClasse d'adaptateur pour,Non recommandé.SiThreadPoolTaskExecutorSi les exigences ne sont pas respectées,Pour envisager d'utiliser cette classe

  4. SimpleThreadPoolTaskExecutor:- Oui.QuartzDeSimpleThreadPoolLa classe de.Le pool de Threads est égalementquartzEt nonquartzUtiliser,Pour utiliser ce type de

  5. ThreadPoolTaskExecutor :Le plus souvent utilisé,Recommandations. C'est essentiellement vraijava.util.concurrent.ThreadPoolExecutorEmballage,————————————————

Références aux articles

  1. Spring Boot(5) @AsyncDétails du pool de fils asynchrones
  2. https://segmentfault.com/a/1190000040134160?utm_source=sf-similar-article
版权声明
本文为[Kenx]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210915071141180Z.html

  1. 别再说你不会JVM性能监控和调优了,2021华为Java高级面试题及答案,
  2. 15 useful cron work examples commonly used by Senior Linux system administrators
  3. Ne dites pas que vous ne pouvez pas surveiller et ajuster les performances JVM, 2021 Huawei Java Advanced interview Questions and Answers,
  4. 別再說你不會JVM性能監控和調優了,2021華為Java高級面試題及答案,
  5. 十多家大厂Java面试真题锦集干货整理,Java开发者该学习哪些东西提高竞争力?
  6. 十分钟带你回顾Spring常问的知识点,35岁老年程序员的绝地翻身之路,
  7. 区区一个SpringBoot问题就被干趴下了,看完这一篇就够了!
  8. K8s gestion des ressources (opérations de base)
  9. Java and cloud native dating
  10. 區區一個SpringBoot問題就被幹趴下了,看完這一篇就够了!
  11. Un problème de démarrage de printemps dans le district a été séché, et c'est assez!
  12. Dix minutes pour vous faire passer en revue les points de connaissance que Spring demande souvent, le chemin du retour Jedi d'un programmeur âgé de 35 ans,
  13. Plus d'une douzaine de grandes usines Java interview vrai sujet brocade collection de marchandises sèches, les développeurs Java devraient apprendre ce qui améliore la compétitivité?
  14. 十分鐘帶你回顧Spring常問的知識點,35歲老年程序員的絕地翻身之路,
  15. Guide de route d'apprentissage Java, redis a plusieurs types de données?
  16. 华为Java高级工程师面试题,字节跳动上千道精选面试题还不刷起来!
  17. 华为Java面试题目,腾讯Java开发面试记录,
  18. Propriétés et méthodes des objets Array en javascript!,Pseudo - classes et pseudo - éléments pour CSS
  19. Design pattern -- agent pattern
  20. 華為Java面試題目,騰訊Java開發面試記錄,
  21. Huawei Java interview title, Tencent Java Development interview record,
  22. Huawei Java Senior Engineer interview question, Byte Jumping thousand Selected Interview Question is still not Brushed!
  23. 双非本科字节跳动Java面试题分享,一篇文章教你搞定计算机网络面试,
  24. 又到一年金三银四,2021最新Java笔试题及答案,
  25. Huawei Finance and Economics 2021 Spring Recruitment interview, what is distributed Lock?Pourquoi utiliser des serrures distribuées?
  26. Un an plus tard, Golden, Silver, Silver, and Silver, 2021, the latest Java written Examination Questions and Answers,
  27. Partage de questions d'entrevue Java à double saut d'octets non - premier cycle, un article vous apprend à gérer l'entrevue réseau informatique,
  28. Computer graduation project java online voting system based on SSM
  29. K8s gestion des ressources (opérations de base)
  30. 又到一年金三銀四,2021最新Java筆試題及答案,
  31. Collection de code de base JavaScript (1)
  32. Vérification des permissions d'interface pour le démarrage du printemps à l'aide d'annotations personnalisées AOP +.
  33. Vérification des permissions d'interface pour le démarrage du printemps à l'aide d'annotations personnalisées AOP +.
  34. Cloud Security Daily 210914: Red Hat Jboss Middleware Platform found important Security Vulnerability and needs to be upgraded as soon as possible
  35. 吐血整理,腾讯团队实力打造spring入门教程,
  36. 史上最全的微服务专业术语面试50问,字节跳动Java岗经典面试真题,
  37. Absolument!C'est l'analyse la plus détaillée du code source de hashtap que j'ai jamais vu!
  38. Computer graduation project Java logistics order management system of logistics company based on SSM
  39. Talk about Kafka: source code analysis of producer
  40. [springboot2 starts from 0] development tips - Lombok, devtools, spring initailizr
  41. 国内一线互联网公司面试题汇总,2021年大厂Java岗面试必问,
  42. 啃完吃透保你涨薪5K,熬夜整理小米Java面试题,
  43. 和字节跳动大佬的技术面谈,Redis成神之路电子版教程已问世,
  44. Le terme professionnel le plus complet de l'histoire des micro - services interview 50 questions, Byte Jumping Java post Classic interview vrai problème,
  45. After using mybatisplus, I haven't written SQL for a long time
  46. [springboot2 starts from 0] how to write a springboot application?
  47. Huawei cloud guassdb (for redis) released a new version, and the two core features were officially unveiled
  48. 和字節跳動大佬的技術面談,Redis成神之路電子版教程已問世,
  49. 啃完吃透保你漲薪5K,熬夜整理小米Java面試題,
  50. Avec l'interview technique du gigolo, le tutoriel électronique redis est sorti.
  51. Après avoir mangé, assurez - vous d'augmenter votre salaire de 5K et de rester debout tard pour trier les questions d'entrevue Java de millet.
  52. Résumé des questions d'entrevue pour les entreprises Internet nationales de première ligne, qui doivent être posées lors de l'entrevue d'emploi Java de la grande usine en 2021,
  53. Le tri des crachats de sang, la force de l'équipe Tencent pour créer le tutoriel d'introduction au printemps,
  54. Java and scala concurrency Fundamentals
  55. Analysis of java thread source code based on Hotspot
  56. 國內一線互聯網公司面試題匯總,2021年大廠Java崗面試必問,
  57. Introduction au module de contrôle de Connexion MySQL
  58. 大厂高级测试面试题,Java面试基础技能罗列,
  59. Comprendre l'architecture sous - jacente d'InnoDB en exécutant une instruction
  60. Chargeur de classe 1 Tomcat