Dalam sistem terdistribusi, untuk memastikan konsistensi yang kuat dari transaksi terdistribusi data, saat memanggil antarmuka RPC atau mengirim MQ, Anda akan melakukan operasi coba lagi untuk mencegah waktu tunggu permintaan jitter. Cara paling umum untuk mencoba lagi adalah MQ, tetapi jika Anda tidak memperkenalkan MQ dalam proyek Anda, itu akan merepotkan. Artikel ini terutama memperkenalkan cara menggunakan Spring Retry untuk mengimplementasikan operasi coba lagi.
1. Tambahkan dependensi Maven
<dependency> <GroupId> org.springframework.retry </groupid> <ArTifactId> Spring-retry </artifactid> <version> 1.1.2.release </version> </dependency> <pendendency> </ArtIdid </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </versi </artifact
2. Tambahkan Kembali Konfigurasi di Startup
@SpringbootApplication @Enableretry Aplikasi kelas publik {public static void main (string [] args) {springapplication.run (application.class, args); }} 3. Layanan Tulis
@Service Public Class RemoteService {private static final Logger Logger = loggerFactory.getLogger (testController.class); @Retryable (value = {BusinessException.class}, maxAttempts = 3, backoff = @Backoff (delay = 5000l, multiplier = 2)) public void call () melempar pengecualian {logger.info ("lakukan sesuatu ..."); Lempar BusinessException baru ("RPC Call Exception"); } @Recover public void recover(BusinessException e) { logger.info(" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4. Tulis pengontrol
@RestController @RequestMapping ("/test") Public Class TestController {private static final Logger Logger = LoggerFactory.getLogger (testController.class); @Autowired Private RemoteService RemoteService; @RequestMapping ("/test") Public String Login () melempar Exception {RemoteService.call (); return string.valueof ("11"); } 5. Kunjungi http: // localhost: 8080/tes/tes
6. Log Tes
2017-07-25 19:28:07 [Info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.call (remoteservice.java:19)] melakukan sesuatu ...
2017-07-25 19:28:12 [Info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.call (remoteservice.java:19)] melakukan sesuatu ...
2017-07-25 19:28:22 [Info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.call (remoteservice.java:19)] melakukan sesuatu ...
2017-07-25 19:28:22 [Info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.recover (remoteservice.java:24)]] ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2017-07-25 19:28:22 [Info]-[http-nio-53602-exec-1]-[com.test.retry.service.remoteservice.recover (remoteservice.java:25)] pengecualian panggilan RPC RPC (remoteservice.java:25)]
7. Instruksi Konfigurasi Terkait
@Enableretry dapat Anda coba lagi ? Ketika properti ProxyTargetClass benar, gunakan proxy CGLIB. Anotasi Java standar digunakan secara default. Di Spring Boot, parameter ini dapat ditulis di pintu masuk program.
@Retryable Metode label anotasi ini akan dicetak ulang saat pengecualian terjadi
Nilai: Tentukan kelas pengecualian yang akan diproses
Termasuk: Kelas pengecualian yang ditangani ditangani sama dengan nilainya, dan standarnya kosong. Ketika mengecualikan juga kosong, semua pengecualian default menjadi semua
Kecualikan: Tentukan bahwa pengecualian tidak diproses, default kosong, ketika disertakan juga kosong, default semua pengecualian
MaxAttempts: Jumlah maksimum retries. Default 3 kali
Backoff: Coba lagi kebijakan tunggu. Gunakan anotasi @Backoff secara default
@Backoff Coba lagi kebijakan tunggu <BR /> Saat parameter tidak diatur, FixedBackOffPolicy digunakan secara default (tentukan waktu tunggu), dan coba lagi menunggu 1000ms
Setel penundaan, gunakan FixedBackOffPolicy (tentukan waktu tunggu), dan cobalah waktu tunggu untuk diisi lagi
Saat menetapkan penundaan dan maxdealy, coba lagi dan tunggu distribusi yang homogen antara kedua nilai ini
Setel penundaan, maxdealy, dan pengganda, gunakan eksponensialbackoffpolicy (implementasi interval retry eksponensial), Multiplier menentukan penundaan multipel, seperti penundaan = 5000L, pengganda = 2, coba lagi adalah 5 detik, kedua kalinya adalah 10 detik, dan ketiga kalinya adalah 20 detik ...
@Recover digunakan untuk metode coba lagi yang gagal @retryable. Parameter metode dari anotasi ini harus merupakan pengecualian yang dilemparkan oleh @Retryable, jika tidak itu tidak akan dikenali. Pemrosesan log dapat dilakukan dalam metode ini.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.