Descrição do problema
Encontrei um problema há algum tempo, e os dados eram confusos quando eu havia repetido solicitações na minha chamada interna do sistema.
Condições de ocorrência: aceitou uma solicitação e a solicitação não foi concluída e a mesma solicitação foi aceita, resultando em um erro de dados (se a solicitação anterior foi concluída, não haverá problema em aceitar a mesma solicitação imediatamente)
Análise de problemas : é causada pela leitura suja do banco de dados
Idéias de solução de problemas
1. Adicione uma grande fechadura (é a maneira mais fácil de implementá -la, mas o desempenho é preocupante e bloqueará as solicitações)
2. Implementar a interceptação de solicitação (pode ser compartilhada, mas como implementá -lo é um problema, como implementá -lo de uma maneira elegante e facilitar a reutilização)
3. Modificar e implementar (as alterações serão feitas no código original, o que é arriscado, e o mais importante é que ela não pode ser compartilhada)
Método de implementação final
Implementado por anotação +mola AOP
usar
NotDuplicate em qualquer método
Classe 1:
import static java.lang.annotation.ElementType.METHOD;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.target; @target ({métod})@retention(retionPolicy.runtime)@documentedPublic @interface notduplicate {}Categoria 2:
importar java.lang.reflect.method; importar java.util.set; import java.util.concurrent.concurrentskiplistset; importar org.aspectj.lang.proecedingJoinPoint; astestj.aspectj.Annation.annation; org.aspectj.lang.annotation.pointcut; importar org.aspectj.lang.reflect.methodSignature; importar org.springframework.tereotype.component;@aspecto@componentpublic class NotDuplicateaOP {private static set) @PointCut (" @AnoTation (com.hhly.skeleton.base.filter.notduplicate)") public void duplicate () {} / ** * Verificação de parâmetros após método interceptando * @param PJP * @return * @THOWSABLE * / @arounds ("Duplicate ()") PJ) MethodSignature msig = (MethodSignature) pjp.getSignature (); Método currentMethod = pjp.gettarget (). GetClass (). GetMethod (msig.getName (), msig.getParameterTypes ()); // Split Signature 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 sinal = sb.toString (); sucesso booleano = key.add (sinal); if (! succcess) {jogue novo serviceruntimeException ("Este método está sendo executado e não pode ser repetido"); } tente {return pjp.proeced (); } finalmente {key.remove (sinal); }}}O exposto acima é todo o conteúdo e códigos relacionados que eu disse desta vez. Se você tiver alguma dúvida, poderá discuti -las na área de comentários abaixo. Obrigado pelo seu apoio ao wulin.com.