Descripción del problema
Encontré un problema hace algún tiempo, y los datos fueron confusos cuando recibí solicitudes repetidas en mi llamada de sistema interno.
Condiciones de ocurrencia: aceptó una solicitud, y la solicitud no se completó y se aceptó la misma solicitud, lo que resultó en un error de datos (si se completó la solicitud anterior, no habrá problemas para aceptar la misma solicitud de inmediato)
Análisis de problemas : es causado por la lectura sucia de la base de datos
Ideas para resolver problemas
1. Agregue un gran bloqueo (es la forma más fácil de implementarlo, pero el rendimiento es preocupante y bloqueará las solicitudes)
2. Implemente la intercepción de solicitud (se puede compartir, pero cómo implementarlo es un problema, cómo implementarlo de manera elegante y facilitar la reutilización)
3. Modificar e implementar (se realizarán cambios en el código original, que es arriesgado, y lo más importante es que no se puede compartir)
Método de implementación final
Implementado por Annotation +Spring AOP
usar
NotDuplicar en cualquier método
Clase 1:
import static java.lang.annotation.ElementType.method; import java.lang.annotation.documented; import java.lang.annotation.retention; import java.lang.annotation.retentionPolicy; importar; importación; java.lang.annotation.target; @Target ({método})@retención(CretentPolicy.runtime)@documentedpublic @interface NotDuplicate {}Categoría 2:
import java.lang.reflect.method; import java.util.set; import java.util.concurrent.concurrentskipListset; import org.aspectj.lang.procedingjoinpoint; importar org.aspectj.lang.annotation.around; import org.aspectj.lang.annotation.aspect; import; import org.aspectj.lang.annotation.pointcut; import org.aspectj.lang.reflect.methodsignature; import org.springframework.stereotype.component;@aspect@componentPublic class noDupplicateAp {conjunto final estático privado <tring> clave = nuevo concurrentskipListset <> (); @PointCut (" @annotation (com.hhly.skeleton.base.filter.notDupLicate)") public void dupplicate () {} / ** * verificación de parámetro después del método interceptando * @param pjp * @return * @throws showable * / @AlEnt ("dupplicate ()") Public Object Dupplate (procediendo JOINPOTOY JOINTOPTOY) MSIG = (Methodsignature) PJP.GetSignature (); Method currentMethod = pjp.getTarget (). GetClass (). GetMethod (msig.getName (), msig.getparametertypes ()); // dividir firma stringBuilder sb = new StringBuilder (currentMethod.ToString ()); Objeto [] args = pjp.getArgs (); for (objeto objeto: args) {if (object! = null) {sb.append (object.getClass (). toString ()); sb.append (object.ToString ()); }} String Sign = sb.ToString (); éxito booleano = key.add (signo); if (! Success) {Throw New ServiceSuntimeException ("Este método se está ejecutando y no se puede repetir"); } try {return pjp.proced (); } finalmente {key.remove (signo); }}}Lo anterior es todo el contenido y los códigos relacionados que te dije esta vez. Si tiene alguna pregunta, puede discutirlas en el área de comentarios a continuación. Gracias por su apoyo a Wulin.com.