Récemment, j'ai rencontré une exigence, à savoir que lorsque le serveur reçoit une demande, il ne nécessite pas que l'exécution de la tâche soit terminée avant de retourner le résultat. Il peut immédiatement renvoyer le résultat et laisser la tâche exécuter de manière asynchrone. La première chose à considérer est de démarrer un nouveau thread pour exécuter la tâche ou de soumettre la tâche à un pool de threads pour l'exécution. Les deux méthodes sont ok. Mais le printemps est si puissant, il doit y avoir une méthode plus simple. Je l'ai juste googlé et ça l'a vraiment. Utilisez simplement les deux annotations @enableasync et @async pour être OK.
Ajouter une annotation @async à la méthode
package me.deweixu.aysncdemo.service; interface publique asyncservice {void asyncMethod (String arg);} Package me.deweixu.aysncdemo.service.ipml; import me.deweixu.aysncdemo.service.asyncservice; import org.springframework.scheduling AsyncService {@async @Override public void asyncMethod (String arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + thread.currentThread (). GetName () + "==============);}}} @Enableasync
Ajouter une annotation @enableasync à la classe de démarrage ou à la classe de configuration
package me.deweixu.aysncdemo; import org.springframework.boot.springApplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.scheduling.annotation.enableasync; @ aperceasyneg AysncDemoApplication {public static void main (String [] args) {SpringApplication.run (aysncdemoApplication.class, args); }} test
package me.deweixu.aysncdemo; import me.deweixu.aysncdemo.service.asyncservice; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; importation; org.springframework.boot.test.context.springboottest; import org.springframework.test.context.junit4.springrunner; @runwith (springrunner.class) @springboottestpublic class AysncDemoapplicationTests {@Autowired AsYncService Asvice; @Test public void testasync () {System.out.println ("=====" + thread.currentThread (). GetName () + "=================);}}==================
2018-03-25 21: 30: 31.391 Info 28742 --- [Main] .SaannotationAsYnCExEcutionInterceptor: Aucun taste exécuteur du bean trouvé pour le traitement asynchronisé: aucun bean de type Taskexecutor et aucun bean nommé 'Taskexecutor'
Arg: Async
===== Simpleasynctaskexecutor-1 ============
D'après les résultats ci-dessus, asyncService.asyncMethod ("async") est en effet exécuté de manière asynchrone et utilise un nouveau fil.
Spécifiez l'exécuteur
D'après le journal d'exécution ci-dessus, vous pouvez deviner que Spring utilise SimpleasynctasKExECUTOR pour exécuter des tâches de manière asynchrone par défaut. Vous pouvez rechercher ce cours. @Async peut également spécifier un exécuteur personnalisé.
Ajouter un exécuteur personnalisé à la classe de démarrage
package me.deweixu.aysncdemo; import org.springframework.boot.springApplication; import org.springframework.boot.autoconfigure.springbootapplication; import org.springframework.scheduling.concurrent.threadpooltaskexecutor; import java.util.concurrent.executor; @ perteasync @ SpringbootApplicationPublic class AysncDemoapplication {public static void main args); } @Bean (name = "ThreadpoolTasKExEcutor") Exécuteur public ThreadPoolTasKExECUTOR () {return newpoolTasKexECUTOR (); }}Spécifiez l'exécuteur
Package me.deweixu.aysncdemo.service.ipml; import me.deweixu.aysncdemo.service.asyncservice; import org.springframework.scheduling AsyncService {@async ("ThreadPoolTasKExEcutor") @Override public void asyncMethod (String arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + thread.currentThread (). GetName () + "=================);}}}De cette façon, utilisez ThreadpoolTasKexECUTOR lors de l'exécution de tâches de manière asynchrone
Définir l'exécuteur par défaut
Comme mentionné ci-dessus, si @async ne spécifie pas d'exécuteur, le SimpleasynctasKexecutor est utilisé par défaut. En fait, l'exécuteur par défaut peut être configuré à l'aide de l'interface AsyncConfigurer.
@Configurationpublic class SpringasyncConfig implémente asyncConfigurer {@Override public exécutor getasyncexecutor () {return new ThreadPoolTasKexECUTOR (); }} Capture d'exception
Des exceptions peuvent se produire dans les méthodes d'exécution asynchrones. Nous pouvons utiliser Try Catch à l'intérieur de la tâche pour gérer les exceptions. Lorsque la tâche lance une exception, Spring fournit également une méthode pour l'attraper.
Implémentez l'interface AsynCuncaughtexceptionHandler
classe publique CustomAsynCexceptionHandler implémente AsynCuncaughtexceptionHandler {@Override public void handleUncaughtexception (Throwable Thrownable Method Method, Object ... Obj) {System.out.println ("Message d'exception -" + throwable.getMessage ()); System.out.println ("Nom de la méthode -" + méthode.getName ()); pour (objet param: obj) {System.out.println ("Valeur du paramètre -" + param); }}}Implémentez l'interface asyncconfigurer réécrivez la méthode GetasynCuncaughtexceptionHandler
@Configurationpublic class SpringasyncConfig implémente asyncConfigurer {@Override public exécutor getasyncexecutor () {return new ThreadPoolTasKexECUTOR (); } @Override public asynCuncaughtexceptionHandler getasynCuncaughtexceptionHandler () {return new CustomAsynCexceptionHandler (); }}Réécrivez la méthode AsyncMethod pour le faire lancer une exception
@Async @Override public void asyncMethod (String arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + thread.currentThread (). GetName () + "===============); lancer un nouveau NullPointerException ();}Résultats en cours:
==================
Arg: Async
===== ThreadpoolTasKexecutor-1 ===========
Message d'exception - Async NullPointerException
Nom de la méthode - AsyncMethod
Valeur du paramètre - Async
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.