1. Exécution et planification des tâches
Spring utilise les interfaces TaskexEcutor et TasksCheduler pour fournir des abstractions pour les tâches d'exécution et de planification asynchrones.
Le Taskexecutor de Spring est le même que l'interface java.util.concurrent.executor. Cette interface n'a qu'une seule méthode exécutée (tâche Runnable).
1.1. Type taskexecutor
Spring a intégré de nombreuses implémentations de TaskexEcutor, et vous n'avez pas besoin de les implémenter vous-même:
1.2. Annotations Prise en charge de la planification et de l'exécution asynchrone
Pour permettre la prise en charge des annotations @Scheduled et @async, ajoutez @EnablesScheduling et @enableasync à l'un de vos
Classes @configuration: @ configuration @ perteasync @ ActiveScheDulingPublic classe AppConfig {}Accorder une attention particulière
Le mode de conseil par défaut pour le traitement des annotations @async est "proxy" qui permet une interférence des appels via le proxy uniquement; Les appels locaux au sein de la même classe ne peuvent pas être interceptés de cette façon. Pour un mode d'interférence plus avancé, envisagez de passer au mode "AspectJ" en combinaison avec le soudage de compilation ou de chargement de chargement.
Par défaut, @async est manipulé avec proxy. Par conséquent, les méthodes de la même classe ne peuvent pas être appelées de manière asynchrone avec @async, et cette situation est toujours synchrone.
Par exemple: ce qui suit, appeler sayshi () directement en externe peut être exécuté de manière asynchrone, tandis que Sayhi () est toujours exécuté de manière synchrone lors de l'appel Sayshello ()
classe publique a {public void sayshello () {sayhi (); } @Async public void sayshi () {}}1.3. @Async Annotation
L'ajout d'annotation @async à la méthode signifie qu'il s'agit d'un appel asynchrone. En d'autres termes, l'appelant de la méthode obtiendra immédiatement le retour et l'exécution de la méthode réelle consiste à soumettre une tâche dans le taskexecutor de Spring.
En d'autres termes, l'appelant reviendra immédiatement lors de l'invocation et l'exécution réelle de la méthode se produira dans une tâche qui a été soumise à un taskexecutor à ressort.
@Asyncvoid doSomething () {// Ceci sera exécuté de manière asynchrone} @Asyncvoid dosomething (String S) {// Ceci sera exécuté de manière asynchrone} @Asyncfuture <string> returnsomething (int i) {// Ceci sera exécuté de manière asynchrone}Avis:
Les méthodes @async peuvent non seulement déclarer un type de retour java.util.concurrent.future régulier, mais aussi l'org.springframework.util.concurrent.ListenableFuture ou, à partir de Spring 4.2, Java.util.concurrent.comPletableFuture: pour un traitement plus riche avec l'interaction plus riche avec les tâches asynchrones et pour un traitement immédiate.
1.4. @ASync Limited Exécuteur
Par défaut, lorsque l'annotation @async est ajoutée à la méthode, un exécuteur qui prend en charge le pilote d'annotation sera utilisé. Cependant, la valeur de la valeur de l'annotation @async peut spécifier un exécuteur supplémentaire
@Async ("OthereXecutor") void dosomething (String S) {// Ceci sera exécuté de manière asynchrone par "Otherexecutor"}Ici, OtheRexecutor est le nom de tout bean exécuteur dans le conteneur à ressort.
1.5. @Async exception Management
Lorsqu'une méthode @async a une valeur de retour de type futur, il est facile de gérer l'exception lancée lors de la saisie de la méthode Get () de Future () pour obtenir le résultat d'exécution de la tâche. Si le type de retour est vide, l'exception ne sera pas capturée.
classe publique MyasynCuncaughTexceptionHandler implémente AsynCuncaughTexceptionHandler {@Override public void handleUnCaughtexception (ex-trony ex, méthode méthode, objet ... params) {// exception de gestion}} 2. Configuration du pool de threads
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.annotation.enableasync; import org.springframework.schedulling.concurrent.threadpooltaskexecutor; Taskexecutorconfig {private entier corepoolSize = 30; entier privé maxpoolSize = 50; entier privé keepaliveseconds = 300; // qu queue entier privé = 2000; @Bean ("MyThreadpoolTasKExECUTOR") public ThreadpoolTasKExECUTOR MyThreadpoolTasKExECUTOR () {ThreadPoolTaskExECUTOR Executor = new ThreadPoolTaskExEcutor (); Executor.SetCorePoolSize (CorePoolSize); Executor.SetMaxPoolSize (MaxPoolSize); EMECTOR.SetkeepalivesEnconds (keepaliveSeconds); // exécutor.setQueueCapacity (queueCapacity); EMECTOR.SetWaitFortAkStoCleteLeShutdown (true); exécuteur.Initialize (); return exécuteur; }} Appel
@Async ("MyThreadpoolTaskExECUTOR") @Override public void présent (couponPresentLogentity Entity) {try {couponBaseResponse rst = couponSendRpcService.send (entity.getUserId (), entity.getCouponBatchkey (), "1", entity.getVendorId ()); if (null! = rst && rst.issuccess ()) {entity.setStatus (présentStatusEnum.success.getType ()); } else {String Raison = (null == RST)? "Exception de réponse": rst.getmsg (); entité.setfailleroferason (raison); entity.setStatus (présentStatusEnum.failure.getType ()); }} catch (exception ex) {log.error (ex.getMessage (), ex); entity.setFailEurnerORe (ex.GetMessage ()); entity.setStatus (présentStatusEnum.failure.getType ()); } couponPresentLogdao.update (entité); }résultat
[Info] 2018-05-09 16: 27: 39.887 [MyThreadpoolTaskExECUTOR-1] [com.ourHours.Coupon.rpc.Dubbo.receivelogFilter] - Recevoir la méthode-nom: envoyer; Arguments: [10046031, "4d7cc32f8f7e4b00bca56f6bf4b3b658", "1", 10001]
[Info] 2018-05-09 16: 27: 39.889 [MyThreadpoolTasKexeCutor-2] [com.ourhours.coupon.rpc.Dubbo.receivelogFilter] - Recevoir la méthode-nom: envoyer; Arguments: [10046031, "4d7cc32f8f7e4b00bca56f6bf4b3b658", "1", 10001]
se référer à:
Spring Framework Reference Documentation 4.3.17.release
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.