Dans Spring Boot (Spring MVC), les demandes sont synchronisées par défaut. Un fil est responsable du passé et de la fin d'une demande. Dans de nombreux cas, afin d'améliorer le débit, certaines opérations doivent être asynchronisées. En plus d'une logique métier qui peut être asynchronisée, notre interface de requête peut également être exécutée de manière asynchrone.
Une demande au service est reçue par un fil d'un conteneur Web, comme le thread http-nio-8084-exec-1
Nous pouvons utiliser WebAsyncTask pour distribuer cette demande à un nouveau thread pour l'exécution, et HTTP-NIO-8084-EXEC-1 peut recevoir le traitement d'autres demandes. Une fois que le WebAsyncTask renvoie les données, elle sera appelée et traitée à nouveau, et la valeur sera renvoyée du côté demandeur de manière asynchrone.
L'exemple de code est le suivant:
@RequestMapping (value = "/ login", méthode = requestMethod.get) public webaSyncTask <ModelandView> longItask () {System.out.println ("/ login est appelé thread id est:" + thread.currentThread (). GetName ()); Callable <ModelAndView> callable = new Callable <ModelAndView> () {public ModelAndView Call () lève une exception {Thread.Sleep (1000); / Simuler les tâches à long terme ModelandView Mav = new ModelAndView ("Login / index"); System.out.println ("Exécution L'ID de thread réussi est:" + thread.currentThread (). GetName ()); retourner mav; }}; Renvoie un nouveau webaSyncTask <ModelandView> (callable);}Vous pouvez voir le résultat de sortie comme suit:
/ La connexion est appelée le thread ID est: http-nio-8084-exec-1
Exécution L'ID de thread avec succès est: Mvcasync1
Le fil avant d'exécuter la logique métier et le fil qui traite spécifiquement de la logique métier ne sont pas les mêmes, ce qui atteint notre objectif.
Ensuite, j'ai fait un test simultané et j'ai constaté que je créais constamment le fil Mvcasync1. Je pensais, la piscine de fil n'est-elle pas utilisée?
Après avoir lu le code source, j'ai constaté que cela était vrai. WebAsyncManager est la classe centrale du Spring MVC pour gérer le traitement asynchrone.
La valeur par défaut consiste à utiliser SimpleasyNctasKExEcutor, qui créera un nouveau thread pour chaque demande.
ASYNCTASKEXECUTOR privé TaskExEcutor = new SimpleasynctasKExECUTOR (this.getClass (). getImpLename ());
Si la tâche spécifie un exécuteur testamentaire, utilisez la tâche le spécifie. Si ce n'est pas le cas, utilisez la valeur par défaut
ASYNCTASKEXECUTOR EMEMPORTOR = webasynctask.getExecutor (); if (exécuteur! = Null) {this.taskexecutor = exécuteur;}Nous pouvons configurer le pool de threads d'Async sans le spécifier séparément pour chaque tâche
Spécifiez par configurer.settaskexecutor (ThreadPoolTaskExEcutor ());
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.concurrent.threadpooltaskexecutor; import org.springframework.web.context.request.async.timeoutcalableprocessent org.springframework.web.servlet.config.annotation.asyncsupportConfigurer; import org.springframework.web.servlet.config.annotation.webmvcconfigurationsupport; @configurationpublic class webmvcconfig ConfigureAsyncSupport (final asyncSupportConfigurer configure) {configurer.SetDefaultTimeout (60 * 1000l); configurer.RegisterCallableInterceptors (timeoutInterceptor ()); configurer.setTaskExEcutor (ThreadPoolTaskExEcutor ()); } @Bean public timeoutCallableProcessingInterceptor timeoutInterceptor () {return new timeoutCallableProcessingInterceptor (); } @Bean public ThreadpoolTasKExECUTOR ThreadpoolTaskExECUTOR () {ThreadPoolTaskExEcutor t = new ThreadPoolTasKExEcutor (); T.SetCorePoolSize (10); t.setMaxPoolSize (50); t.setThreadnamePrefix ("yjh"); retour t; }}Après la configuration, vous pouvez voir que le nom de thread de sortie commence par YJH et que les nouveaux threads ne seront pas créés tout le temps.
Vous pouvez voir le résultat de sortie comme suit:
/ La connexion est appelée le thread ID est: http-nio-8084-exec-1 exécution id thread est: yjh1
Résumer
Ce qui précède est ce que l'éditeur a présenté à Spring Boot utilise WebAsyncTask pour renvoyer les résultats de manière asynchrone. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!