En el blog anterior, presentamos el uso del reintento de primavera. Este artículo demuestra el principio de implementación del reintento de primavera a través de un ejemplo simple. Las anotaciones definidas en el ejemplo solo contienen el número de atributos de reintento. De hecho, las anotaciones en el reintento de primavera pueden establecer más atributos. Para explicar el principio, es más simple. Para el reintento de primavera, puede consultar documentos y blogs relevantes.
Definición de anotación
paquete reinty.annotation; import java.lang.annotation.*;/*** creado por Jack.wu el 2016/9/30. */@Target (elementType.method) @Retention (retentionPolicy.Runtime) @DocumentedPublic @Interface Retryable {int maxatTemps () predeterminado 0;}Implementación de agentes
Usando CGLIB como herramienta proxy, primero escriba una implementación de devolución de llamada, que también es la lógica central de la implementación de reintento.
paquete retry.interceptor; import net.sf.cglib.proxy.methodinterceptor; import net.sf.cglib.proxy.methodproxy; import reinty.annotation.cretryable; import java.lang.reflect.method;/*** creado por Jack.wu en 2016/9/30. */public class AnnotationAwarereretryOperationsInterceptor implementa MethodInterceptor {// Registre el número de reintentos privados intimes = 0; @Override Public Object Intercept (Obj Obj, Method Method, Object [] Args, MethodProxy proxy) lanza lanzar {// obtener anotación de recuperable en el método interceptado retrandable Rellable = Method.getAnnotation (retrestable.class); if (retryable == null) {return proxy.Invokesuper (obj, args); } else {// con anotación de volver al reintento, agregue la excepción de reintento lógica int maxattemps = retryable.maxattemps (); intente {return proxy.invokesuper (obj, args); } catch (Throwable E) {if (Times ++ == Maxattemps) {System.out.println ("Se han alcanzado reintentos máximos:" + maxattemps + ", ¡no más reintento!"); } else {System.out.println ("Call" + Method.getName () + "Excepción del método, inicio" + Times + "Vuelva a intentarlo ..."); // Tenga en cuenta que este no es el método Invokesuper, Invokesuper saldrá del Interceptor de procesamiento actual Proxy.Invoke (OBJ, Args); }}} return null; }}Luego escriba una clase de proxy y use AnnotationAwareretryOperationsInterceptor como interceptor
paquete RETRY.Core; import net.sf.cglib.proxy.enhancer; importación de importación.interceptor.AnnotationAwarerRetyOperationsInterceptor;/*** creado por Jack.wu el 2016/9/30. */public class SpringRetryProxy {Public Object NewProxyInstance (Object Target) {mejor mejor mejor. potencador.setsuperClass (target.getClass ()); potencador.setCallback (New AnnotationAwareretryOperationsInterceptor ()); return mejor.create (); }}prueba
Pruebe el código anterior a través de un método comercial relacionado con el usuario
Definición de la interfaz:
paquete fachada;/*** creado por Jack.wu el 2016/9/26. */Public Interface UserFacade {void add () arroja excepción; La consulta void () lanza la excepción;}Implementación de la interfaz: paquete facade.impl;
import fachade.userfacade; importar rey.annotation.cretryable;/*** creado por Jack.wu el 2016/9/26. */public class UserFacadeImpl implementa UserFacade {@Override public void add () lanza la excepción {System.out.println ("Agregar usuario ..."); tirar nueva runtimeException (); } @Override @cryryable (maxattemps = 3) public void Query () {System.out.println ("Usuario de consulta ..."); tirar nueva runtimeException (); }}prueba:
public class Main {public static void main (string [] args) lanza la excepción {userFacadeImpl user = new UserFacadeImpl (); // prueba proxy de springryrretryproxy springryproxy = new SpringryRyProxy (); UserFacade u = (UserFacade) SpringretryProxy.newproxyInstance (usuario); //u.add() ;//no volver a intentar U.Query (); // reintento fallido}} El método ADD no agrega anotaciones de reintento, el programa termina anormalmente, el método de consulta agrega anotaciones de reintento, establece volver 3 veces y el efecto de ejecución es el siguiente
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.