이전 블로그에서 우리는 Spring Retry의 사용을 소개했습니다. 이 기사는 간단한 예를 통해 스프링 재 시도의 구현 원칙을 보여줍니다. 예제에 정의 된 주석에는 레트리 속성의 수만 포함됩니다. 실제로, 스프링 재 시도의 주석은 더 많은 속성을 설정할 수 있습니다. 원리를 설명하기 위해 더 간단합니다. Spring Retry의 경우 관련 문서 및 블로그를 확인할 수 있습니다.
주석 정의
패키지 retry.annotation; import java.lang.annotation.*;/*** jack.wu가 2016/9/30에 작성했습니다. */@target (elementType.Method) @retention (rendentionPolicy.runtime) @DocumentEdPublic @Interface retryable {int maxAttemps () 기본값 0;}에이전트 구현
CGLIB를 프록시 도구로 사용하여 먼저 콜백 구현을 작성하며 이는 레트리 구현의 핵심 논리이기도합니다.
패키지 retry.interceptor; import net.sf.cglib.proxy.methodinterceptor; import net.sf.cglib.proxy.methodproxy; import retry.annotation.restryable; import java.lang.reflect.method;/*** jack.wu에 의해 생성. */public class annotationAwareretryOperationsinterceptor implements MethodInterceptor {// 회수 수를 기록한 개인 int times = 0; @Override public Object Intercept (Object OBJ, Method Method, Object [] args, MethodProxy Proxy) 던지기 가능 {// 인터셉트 된 메소드에서 재 시도 가능한 주석을 가져옵니다. retryable retryable = method.getAntal.class); if (retryable == null) {return proxy.invokesuper (obj, args); } else {// 재 시도 가능한 주석을 사용하면 예외 재시 도로 로직 int maxAttemps = retryable.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 ..."); // 이것은 호출자 메소드가 아니라는 점에 유의하십시오. 호출자는 현재 인터셉터 프로세스 proxy.invoke (obj, args)를 종료합니다. }}} return null; }}그런 다음 프록시 클래스를 작성하고 annotationAwareretryOperationsinterceptor를 인터셉터로 사용하십시오.
패키지 retry.core; import net.sf.cglib.proxy.enhancer; import retry.interceptor.annotationawareretryoperationsinterceptor;/*** jack.wu에 의해 생성 된 2016/9/30. */public class springretryproxy {public Object NewProxyInstance (Object Target) {Enhancer Enhancer = new Enhancer (); Enhancer.setSuperClass (target.getClass ()); Enhancer.setCallback (New AnnotationAwareretryOperationsInterceptor ()); return enhancer.create (); }}시험
사용자 관련 비즈니스 방법을 통해 위 코드를 테스트하십시오
인터페이스 정의 :
패키지 외관;/*** 2016/9/26에 Jack.wu가 작성했습니다. */public interface userFacade {void add ()는 예외를 던집니다. void query ()는 예외를 던지 릅니다.}인터페이스 구현 : 패키지 Facade.impl;
import facade.userfacade; import retry.annotation.resryable;/*** jack.wu가 2016/9/26에 만들어냅니다. */public class userFacadeImpl은 userFacade {@override public void add ()가 예외 {system.out.println ( "Add User ..."); 새로운 runtimeexception ()을 던지십시오. } @override @retryable (maxAttemps = 3) public void query () {system.out.println ( "쿼리 사용자 ..."); 새로운 runtimeexception ()을 던지십시오. }}시험:
public class main {public static void main (String [] args)은 예외 {userfacadeimpl user = new userFacadeImpl (); // SpringRetry 프록시 테스트 SpringRetryProxy SpringRetryProxy = 새로운 SpringRetryProxy (); userFacade u = (userFacade) SpringReTryProxy.NewProxyInstance (user); //u.add() ;//no retry u.query (); // 실패}} ADD 메소드는 재 시도 주석을 추가하지 않으며 프로그램은 비정상적으로 끝나고 쿼리 메소드는 재 시도 주석을 추가하고, 재 시도를 3 번 설정하며, 실행 효과는 다음과 같습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.