Dans le blog précédent, nous avons introduit l'utilisation de Spring Reryn. Cet article démontre le principe de mise en œuvre de Spring Rerym à travers un exemple simple. Les annotations définies dans l'exemple ne contiennent que le nombre d'attributs de réessayer. En fait, les annotations de Spring Reryn peuvent définir plus d'attributs. Afin d'expliquer le principe, il est plus simple. Pour Spring Reryn, vous pouvez consulter des documents et des blogs pertinents.
Définition d'annotation
Package Retry.annotation; Importer java.lang.annotation. *; / ** * Créé par Jack.wu le 2016/9/30. * / @ Target (elementType.Method) @retention (retenderPolicy.runtime) @DocumentEdPublic @Interface Retchable {int maxattemps () par défaut 0;}Mise en œuvre de l'agent
En utilisant CGLIB comme outil de proxy, rédigez d'abord une implémentation de rappel, qui est également la logique principale de l'implémentation de réessayer.
package retry.interceptor; import net.sf.cglib.proxy.methodinterceptor; import net.sf.cglib.proxy.methodproxy; import rery.annotation.retryable; import java.lang.reflect.method; / ** * créé par Jack.wu en 2016/9/30. * / classe publique AnnotationAwareRetryOperations Interceptor implémente MethodInterceptor {// Enregistrez le nombre de Retries private int times = 0; @Override Public Object Intercept (Object Obj, méthode Method, objet [] args, méthodeproxy proxy) lève le throwable {// obtenir une annotation réimprimé dans la méthode interceptée RETRINCAY RETRIABLE = Method.getAntanTation (Rettryable.Class); if (retringable == null) {return proxy.invokesuper (obj, args); } else {// Avec l'annotation réimprimée, ajoutez l'exception de réessayer Logic int maxattemps = redriquable.maxattemps (); essayez {return proxy.invokesuper (obj, args); } catch (Throwable E) {if (Times ++ == Maxattemps) {System.out.println ("Maximum Retries a été atteint:" + Maxattemps + ", plus de réessayer!"); } else {System.out.println ("appel" + méthode.getName () + "Exception de la méthode, démarrage" + Times + "Retry ..."); // Notez que ce n'est pas la méthode invokeuper, invokeuper quittera le traitement intercepteur actuel proxy.invoke (obj, args); }}} return null; }}Ensuite, écrivez une classe de proxy et utilisez AnnotationAwareRetryOperations Interceptor comme intercepteur
Package Retry.core; Importer net.sf.cglib.proxy.enhancer; Importer Retry.Interceptor.annotationAwareRetryOperations Interceptor; / ** * créé par Jack.wu le 2016/9/30. * / classe publique SpringRetryProxy {public Object NewProxyInstance (Object Target) {Enhancer Enhancer = new Enhancer (); Enhancer.SetSuperclass (Target.GetClass ()); Enhancer.SetCallback (new AnnotationAwareRetryOperations Interceptor ()); return Enhancer.Create (); }}test
Testez le code ci-dessus via une méthode commerciale liée à l'utilisateur
Définition de l'interface:
FACADE Package; / ** * Créé par Jack.wu le 2016/9/26. * / interface publique UserFacade {void add () lance une exception; void query () lève l'exception;}Implémentation d'interface: FACADE Package.impl;
Importer FACADE.USERFACADE; IMPORT RETRY.Annotation.retryable; / ** * Créé par Jack.wu le 2016/9/26. * / classe publique UserFacadeImpl implémente userFacade {@Override public void add () lève une exception {System.out.println ("add user ..."); lancer un nouveau runtimeException (); } @Override @Retryable (maxattemps = 3) public void query () {System.out.println ("Query User ..."); lancer un nouveau runtimeException (); }}test:
classe publique Main {public static void main (string [] args) lève l'exception {userFacadeImpl user = new UserFacadeIMPl (); // Test proxy de Springretry SpringretryProxy SpringRentryProxy = new SpringRentryProxy (); UserFacade u = (userFacade) springRetryProxy.newProxyInstance (utilisateur); //U.Add() ;//no Retry U.Query (); // a échoué RETRY}} La méthode ADD n'ajoute pas d'annotations de réessayer, le programme se termine anormalement, la méthode de requête ajoute des annotations de réessayer, les ensembles de réessayer 3 fois, et l'effet en cours d'exécution est le suivant
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.