Description du problème
J'ai rencontré un problème il y a quelque temps, et les données étaient déroutantes lorsque j'avais répété les demandes dans mon appel système interne.
Conditions d'occurrence: a accepté une demande, et la demande n'a pas été terminée et la même demande a été acceptée, ce qui a entraîné une erreur de données (si la demande précédente était terminée, il n'y aura aucun problème à accepter la même demande immédiatement)
Analyse des problèmes : elle est causée par une sale lecture de la base de données
Idées de résolution de problèmes
1. Ajoutez une grande serrure (c'est le moyen le plus simple de le mettre en œuvre, mais les performances sont inquiétantes et il bloquera les demandes)
2. Mettre en œuvre l'interception de la demande (peut être partagée, mais comment la mettre en œuvre est un problème, comment la mettre en œuvre d'une manière élégante et faciliter la réutilisation)
3. Modifier et mettre en œuvre (des modifications seront apportées au code d'origine, ce qui est risqué, et le plus important est qu'il ne peut pas être partagé)
Méthode de mise en œuvre finale
Implémenté par Annotation + Spring AOP
utiliser
Notduplicate sur n'importe quelle méthode
Classe 1:
Importer statique java.lang.annotation.elementType.Method; import java.lang.annotation.documented; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; importation; java.lang.annotation.target; @target ({méthode}) @ rétention(retentionpolicy.runtime)@documedpublic @interface notduplicate {}Catégorie 2:
import java.lang.reflect.method; import java.util.set; import java.util.concurrent.concurrentSkiplistSet; import org.aspectj.lang.proceedingjoinpoint; import org.aspectj.lang.annotation.aroun; org.aspectj.lang.annotation.pointcut; import org.aspectj.lang.reflect.methodsignature; import org.springframework.sterreotype. @Pointcut ("@ annotation (com.hhly.skeleton.base.filter.notduplicate)") public void Duplicate () {} / ** * Vérification du paramètre après la méthode interceptant * @param pjp * @return * @throws throwable * / @around ("duplate ()") DUPLICULATION (ProcedingJoineppoint PJP) (Methodsignature) pjp.getSignature (); Méthode CurrentMethod = pjp.getTarget (). GetClass (). GetMethod (msig.getName (), msig.getParameterTypes ()); // Split Signature StringBuilder sb = new StringBuilder (currentMethod.ToString ()); Objet [] args = pjp.getargs (); pour (objet objet: args) {if (object! = null) {sb.append (object.getClass (). toString ()); sb.append (object.toString ()); }} String signe = sb.toString (); Boolean Success = Key.Add (signe); if (! Success) {lancer un nouveau service ServiceRuntimeException ("Cette méthode est en cours d'exécution et ne peut pas être répétée"); } essayez {return pjp.proceed (); } enfin {key.remove (signe); }}}Ce qui précède est tout le contenu et les codes connexes que je vous ai dit cette fois. Si vous avez des questions, vous pouvez en discuter dans la zone de commentaires ci-dessous. Merci pour votre soutien à Wulin.com.