Deskripsi masalah
Saya mengalami masalah beberapa waktu lalu, dan data membingungkan ketika saya telah mengulangi permintaan dalam panggilan sistem internal saya.
Ketentuan Kejadian: Menerima permintaan, dan permintaan tidak selesai dan permintaan yang sama diterima, menghasilkan kesalahan data (jika permintaan sebelumnya selesai, tidak akan ada masalah menerima permintaan yang sama segera)
Analisis Masalah : Ini disebabkan oleh pembacaan database yang kotor
Ide pemecahan masalah
1. Tambahkan kunci besar (ini adalah cara termudah untuk mengimplementasikannya, tetapi kinerjanya mengkhawatirkan dan akan memblokir permintaan)
2. Menerapkan permintaan intersepsi permintaan (dapat dibagikan, tetapi bagaimana mengimplementasikannya adalah masalah, bagaimana mengimplementasikannya dengan cara yang elegan dan memfasilitasi penggunaan kembali)
3. Modifikasi dan implementasikan (perubahan akan dilakukan pada kode asli, yang berisiko, dan yang paling penting adalah bahwa itu tidak dapat dibagikan)
Metode Implementasi Akhir
Diimplementasikan oleh Anotasi +Musim Semi AOP
menggunakan
Notduplicate pada metode apa pun
Kelas 1:
Impor statis java.lang.annotation.elementtype.method; impor java.lang.annotation.Documented; impor java.lang.annotation.retention; impor java.lang.annotation.RetentionPolicy; Impor java.lang.annotation.target; @Target ({Method})@retention(RetensiPolicy.runtime)@documentedpublic @interface notduplicate {}Kategori 2:
Impor java.lang.reflect.method; impor java.util.set; impor java.util.concurrent.concurrentskiplistset; org.aspectj.lang.proedingjoinpoint; impor org.aspection.lang.annotation.around; org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component;@Aspect@Componentpublic class NotDuplicateAop { private static final Set<String> KEY = new ConcurrentSkipListSet<>(); @Pointcut (" @annotasi (com.hhly.skeleton.base.filter.notduplicate)") public void duplicate () {} / ** * Parameter verifikasi Setelah mencegat metode * @param pjp * @return * @throws Throwable * / @around ("duplicate ()") @trows duplicate ("duplicate ()") duplicate () ") @trows duplicate (" duplicate () ") duplicate ()") @trows duplicate ("duplicate") MSIG = (MethodyIgnature) pjp.getSignature (); Metode currentMethod = pjp.getTarget (). GetClass (). GetMethod (msig.getname (), msig.getParametertypes ()); // Split Signature StringBuilder SB = New StringBuilder (currentMethod.toString ()); Objek [] args = pjp.getArgs (); untuk (objek objek: args) {if (objek! = null) {sb.append (objek.getClass (). toString ()); SB.Append (Object.ToString ()); }} String Sign = SB.ToString (); Boolean Success = key.add (tanda); if (! Success) {lempar serviceruntimeException baru ("Metode ini sedang dieksekusi dan tidak dapat diulang"); } coba {return pjp.proed (); } akhirnya {key.remove (tanda); }}}Di atas adalah semua konten dan kode terkait yang saya katakan kali ini. Jika Anda memiliki pertanyaan, Anda dapat mendiskusikannya di area komentar di bawah ini. Terima kasih atas dukungan Anda untuk wulin.com.