Im vorherigen Blog haben wir die Verwendung von Frühlings -Wiederholung eingeführt. Dieser Artikel zeigt das Implementierungsprinzip des Frühlingsrates durch ein einfaches Beispiel. Die im Beispiel definierten Anmerkungen enthalten nur die Anzahl der Wiederholungsattribute. Tatsächlich können die Annotationen im Frühjahr Wiederholung mehr Attribute festlegen. Um das Prinzip zu erklären, ist es einfacher. Für die Wiederholung des Frühlings können Sie relevante Dokumente und Blogs überprüfen.
Annotationsdefinition
Paket Retyry.Annotation; Import Java.lang.Annotation.*;/*** Erstellt von Jack.wu am 2016/9/30. */@Target (elementtype.method) @retention (retentionPolicy.runtime) @DocumentedPublic @Interface RECKABLE {int maxAttemps () Standard 0;}Implementierung von Agenten
Schreiben Sie zuerst eine Callback -Implementierung, die auch die Kernlogik der Wiederholungsimplementierung darstellt.
Paket retypry.Interceptor; import net.sf.cglib.proxy.methodinterceptor; import net.sf.cglib.proxy.methodproxy; importieren retry.annotation */public class AnnotationAwareretryoperationsInterceptor implementiert methodInterceptor {// Aufzeichnung der Anzahl der Absen private int Times = 0; @Override Public Object Intercept (Object OBJ, Methode Methode, Object [] args, MethodProxy Proxy) löst Throwable {// Wiederholbare Annotation in der intercepted method wieder auf, die wiederverschreibungsable = methode.getannotation (Wiederholung.Class); if (retypable == null) {return proxy.invokesuper (obj, args); } else {// mit wiederverzierbarer Annotation fügen Sie Ausnahme -Wiederholungs -Logik int maxattemps = retyryable.maxattemps (); Versuchen Sie {return proxy.invokesuper (obj, args); } catch (throwable e) {if (times ++ == maxAttemps) {System.out.println ("Maximale Wiederholungen wurden erreicht:" + maxAttemps + ", kein Wiederholung!"); } else {system.out.println ("call" + method.getName () + "Methode -Ausnahme, start" + mal + "resy ..."); // Beachten Sie, dass dies nicht die Invocesuper -Methode ist. Invocesuper beendet den aktuellen Interceptor Processing Proxy.invoke (OBJ, Args); }}} return null; }}Schreiben Sie dann eine Proxy -Klasse und verwenden
Paket retypry.core; import net.sf.cglib.proxy.enhancer; importieren retypry.interceptor */öffentliche Klasse SpringRetryProxy {public Object NewProxyInstance (Objektziel) {Enhancer Enhancer = new Enhancer (); Enhancer.SetsuperClass (target.getClass ()); Enhancer. return Enhancer.create (); }}prüfen
Testen Sie den obigen Code über eine benutzerbezogene Geschäftsmethode
Schnittstellendefinition:
Paketfassade;/*** Erstellt von Jack.wu am Jahr 2016/9/26. */public interface userfacade {void add () löst Ausnahme aus; void query () löst Ausnahme aus;}Schnittstellenimplementierung: Paketfassade.impl;
facade import.userfacade; retyry.annotation */public class userfacadeimpl implementiert userfacade {@Override public void add () löst Ausnahme aus {System.out.println ("Benutzer hinzufügen ..."); neue runimeexception () werfen; } @Override @retryable (maxAttemps = 3) public void query () {System.out.println ("Query -Benutzer ..."); neue runimeexception () werfen; }}prüfen:
public class main {public static void main (String [] args) löst eine Ausnahme aus {userFacadeimpl user = new UserFacadeImpl (); // SpringRetry Proxy -Test SpringRetryProxy SpringRetryProxy = New SpringRetryProxy (); UserFacade u = (userFacade) SpringRetryProxy.NewProxyInstance (Benutzer); //u.add();//no REGRY U.Query (); // fehlgeschlagener Wiederholung}} Die add -Methode fügt keine Wiederholungsanmerkungen hinzu, das Programm endet abnormal, die Abfragemethode fügt wiederholte Anmerkungen hinzu, setzt das dreimal
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.