В предыдущем блоге мы представили использование Spring Retry. Эта статья демонстрирует принцип реализации пружины повторения через простой пример. Аннотации, определенные в примере, содержат только количество атрибутов повторной попытки. Фактически, аннотации в Spring Retry могут установить больше атрибутов. Чтобы объяснить принцип, он проще. Для Spring Retry вы можете проверить соответствующие документы и блоги.
Определение аннотации
Package retry.annotation; импорт java.lang.annotation.*;/*** Создан Jack.wu на 2016/9/30. */@Target (elementtype.method) @retention (armentpolicy.runtime) @documentedpublic @interface retryable {int maxattemps () default 0;}Реализация агента
Используя CGLIB в качестве прокси -инструмента, сначала напишите реализацию обратного вызова, которая также является основной логикой реализации повторной службы.
package retry.interceptor; import net.sf.cglib.proxy.methodinterceptor; import net.sf.cglib.proxy.methodproxy; импорт retry.annotation.retryable; импорт java.lang.reflect.method;/*** Создан Джеком. Wu на 2016/9/30. */public Class AnnotationAwareretryTricationsInterceptor реализует MethodInterceptor {// Записать количество повторных поисков int times = 0; @Override Public Object Intercept (объект obj, метод метода, объект [] args, methodproxy proxy) бросает throwable {// получить повторяющуюся аннотацию в перехваченном методе Retryable Retryable = method.getannotation (retryable.class); if (stryable == null) {return proxy.invokesuper (obj, args); } else {// с повторяющейся аннотацией, добавьте исключение, повторение логики int maxattemps = stryable.maxattemps (); try {return proxy.invokesuper (obj, args); } catch (throwable e) {if (times ++ == maxattemps) {System.out.println («Максимальные повторные данные были достигнуты:« + maxattemps + », больше нет повторения!»); } else {System.out.println ("call" + method.getName () + "Исключение метода, начало" + times + "retry ..."); // Обратите внимание, что это не метод Allokesuper, infokesuper выходит из текущего прокси -прокси -концепции перехвата. }}} return null; }}Затем напишите класс прокси и используйте AnnotationAwareretrytryPerationsInterceptor как перехватчик
package retry.core; import net.sf.cglib.proxy.enhancer; import retry.interceptor.annotationAwareretryperationsInterceptor;/*** Создан Jack.wu на 2016/9/30. */public class SpringretryProxy {public Object newProxyInstance (объект цели) {Enhancer Enhancer = new Enhancer (); Enhancer.setSuperClass (target.getClass ()); Enhancer.SetCallback (New AnnotationAwareretryperationsInterceptor ()); return Enhancer.create (); }}тест
Проверьте приведенный выше код с помощью бизнес-метода, связанного с пользователем
Определение интерфейса:
Package Facade;/*** Создан Jack.wu 2016/9/26. */public interface userfacade {void add () выбрасывает исключение; void Query () бросает исключение;}Реализация интерфейса: пакет facade.impl;
Import facade.userfacade; импорт повторной вершины.annotation.retryable;/*** Создан Jack.wu 2016/9/26. */public class userfacadeimpl реализует userfacade {@override public void add () выбрасывает exection {system.out.println ("добавить пользователь ..."); бросить новый runtimeexception (); } @Override @retryable (maxattemps = 3) public void Query () {System.out.println ("Query User ..."); бросить новый runtimeexception (); }}тест:
открытый класс main {public static void main (string [] args) выбрасывает исключение {userFacadeImpl user = new userFacadeImpl (); // Springretry Proxy Test SpringretryProxy SpringretryProxy = new SpringretryProxy (); Userfacade u = (userfacade) springretryproxy.newproxyinstance (пользователь); //u.add();//no повторно u.query (); // неудачная повторная попытка}} Метод добавления не добавляет аннотации повторных рисков, программа заканчивается ненормально, метод запроса добавляет аннотации повторных попыток, устанавливает повторную попытку 3 раза, а эффект бега следующим образом
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.