Di blog sebelumnya, kami memperkenalkan penggunaan Spring Retry. Artikel ini menunjukkan prinsip implementasi Spring Retry melalui contoh sederhana. Anotasi yang didefinisikan dalam contoh hanya berisi jumlah atribut RETRY. Faktanya, anotasi dalam RETRY Spring dapat menetapkan lebih banyak atribut. Untuk menjelaskan prinsipnya, lebih sederhana. Untuk Spring Retry, Anda dapat memeriksa dokumen dan blog yang relevan.
Definisi anotasi
paket retry.annotation; import java.lang.annotation.*;/*** dibuat oleh jack.wu pada 2016/9/30. */@Target (elementType.method) @retention (retentionpolicy.runtime) @documentedpublic @interface Retryable {int maxattemps () default 0;}Implementasi Agen
Menggunakan CGLIB sebagai alat proxy, pertama -tama tulis implementasi panggilan balik, yang juga merupakan logika inti dari implementasi coba lagi.
paket retry.interceptor; impor net.sf.cglib.proxy.methodInterceptor; impor net.sf.cglib.proxy.methodproxy; impor retry.annotation.Retryable; import java.lang.reflect.method;/*** dibuat oleh jack.wu pada 2016/9/30/30. */Kelas Publik AnnotationAwareretryOperationsInterSeptor mengimplementasikan MethodInterceptor {// Catat jumlah retries private int Times = 0; @Override Public Object Intercept (Object OBJ, Metode Metode, Object [] args, MethodProxy Proxy) melempar lempar {// dapatkan anotasi yang dapat dikecilkan dalam metode yang dicegat dapat dikembalikan ulang ulang = metode .getAnnotation (Retryable.class); if (retryable == null) {return proxy.invokeSuper (obj, args); } else {// dengan anotasi yang dapat dikembalikan, tambahkan pengecualian ulang logika int maxattemps = retryable.maxattemps (); coba {return proxy.invokeSuper (obj, args); } catch (Throwable e) {if (Times ++ == maxattemps) {System.out.println ("Retries maksimum telah tercapai:" + maxattemps + ", tidak lagi coba lagi!"); } else {system.out.println ("call" + method.getName () + "Metode Exception, Mulai" + Times + "Repetry ..."); // Perhatikan bahwa ini bukan metode InvokeSuper, InvokeSuper akan keluar dari pemrosesan interceptor saat ini proxy.invoke (OBJ, args); }}} return null; }}Kemudian tulis kelas proxy dan gunakan annotationAwareretryOperationInterceptor sebagai pencegat
paket retry.core; import net.sf.cglib.proxy.enhancer; impor retry.interceptor.annotationAwareretryOperationIndInceptor;/*** Dibuat oleh jack.wu pada 2016/9/30. */Kelas Publik SpringRryProxy {Objek Publik NewProxyInstance (Object Target) {Enhancer Enhancer = New Enhancer (); Enhancer.setsuperclass (target.getClass ()); Enhancer.setCallback (AnnotationAwareretryOperationPerInceptor baru ()); return enhancer.create (); }}tes
Uji kode di atas melalui metode bisnis terkait pengguna
Definisi Antarmuka:
Paket fasad;/*** dibuat oleh jack.wu pada 2016/9/26. */antarmuka publik userfacade {void add () melempar pengecualian; void query () melempar pengecualian;}Implementasi Antarmuka: Paket fasad.
impor facade.userfacade; impor retry.annotation.retryable;/*** dibuat oleh jack.wu pada 2016/9/26. */kelas publik UserFacadeImpl mengimplementasikan UserFacade {@Override public void add () melempar Exception {System.out.println ("Tambahkan pengguna ..."); lempar runimeException baru (); } @Override @Retryable (maxattemps = 3) public void query () {System.out.println ("User kueri ..."); lempar runimeException baru (); }}tes:
kelas publik {public static void main (string [] args) melempar pengecualian {userfacadeImpl user = UserFacadeImpl () baru; // tes proxy springretry springretryproxy springretryproxy = new springretroxy (); Userfacade u = (userfacade) springretryproxy.newproxyInstance (user); //u.add();//no retry u.query (); // gagal ulang}} Metode tambah tidak menambahkan ulang anotasi, program berakhir secara tidak normal, metode kueri menambahkan ulang anotasi, set coba lagi 3 kali, dan efek berjalan adalah sebagai berikut
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.