Artikel ini terutama mempelajari penjelasan terperinci tentang contoh pemrograman pemrograman Java Contoh mekanisme dan berbagi contoh kode yang relevan. Editor berpikir itu cukup bagus dan memiliki nilai referensi tertentu. Teman yang membutuhkannya bisa merujuknya.
Fungsi perlu diimplementasikan dalam aplikasi: Data perlu diunggah ke layanan penyimpanan jarak jauh, dan operasi lain dilakukan ketika pemrosesan pengembalian berhasil. Fungsi ini tidak rumit dan dibagi menjadi dua langkah: langkah pertama adalah memanggil pembungkus logika layanan Remote REST untuk mengembalikan hasil pemrosesan ke metode pemrosesan; Langkah kedua adalah mendapatkan hasil dari langkah pertama atau menangkap pengecualian. Jika kesalahan atau pengecualian terjadi, logika unggahan akan dicetak ulang, jika tidak, operasi logis akan dilanjutkan.
Berdasarkan logika unggahan normal, logika fungsi dieksekusi dengan menilai apakah hasil pengembalian atau mendengarkan keputusan pengecualian sedang mencoba lagi. Pada saat yang sama, untuk memecahkan eksekusi yang tidak valid dari coba lagi (dengan asumsi bahwa pengecualian disebabkan oleh ketidakstabilan eksekusi eksternal), logika fungsi merupakan eksekusi untuk waktu tunda tertentu.
public void CommonRetry (MAP <String, Object> DATAMAP) melempar InterruptedException {MAP <String, Object> parammap = maps.newhashMap (); parammap.put ("Tablename", "CreativeTable"); parammap.put ("ds", "20160220"); parammap.put ("datamap", datamap); Hasil boolean = false; coba {result = unggahToodps (parammap); if (! hasil) {thread.sleep (1000); unggahtoodps (parammap); // coba sekali}} catch (pengecualian e) {thread.sleep (1000); unggahtoodps (parammap); // coba sekali}}Solusi di atas mungkin masih tidak valid untuk dicoba lagi. Untuk mengatasi masalah ini, cobalah untuk meningkatkan jumlah coba lagi dan coba lagi interval interval untuk mencapai kemungkinan meningkatkan coba lagi valid.
public void CommonRetry (MAP <String, Object> DATAMAP) melempar InterruptedException {MAP <String, Object> parammap = maps.newhashMap (); parammap.put ("Tablename", "CreativeTable"); parammap.put ("ds", "20160220"); parammap.put ("datamap", datamap); Hasil boolean = false; coba {result = unggahToodps (parammap); if (! hasil) {reuploadtoodps (parammap, 1000l, 10); // tunda ganda retry}} catch (pengecualian e) {reuploadtoodps (parammap, 1000l, 10); // tunda ganda retry}}Ada masalah dengan Solution 1 dan Solution 2: Logika normal dan coba lagi sangat digabungkan. Coba lagi logika sangat bergantung pada hasil eksekusi logika normal, dan pemicu coba lagi untuk hasil yang diharapkan dari logika normal. Akar penyebab coba lagi sering kali kewalahan oleh logika kompleks, yang dapat menyebabkan pemahaman yang tidak konsisten tentang masalah apa yang harus dipecahkan untuk operasi dan pemeliharaan selanjutnya. Percuaan ulang sulit untuk dijamin dan tidak kondusif untuk operasi dan pemeliharaan, karena coba lagi desain bergantung pada pengecualian logika normal atau mencoba kembali akar penyebab dugaan.
Jadi apakah ada solusi yang dapat digunakan untuk memisahkan logika normal dan mencoba lagi logika, dan pada saat yang sama, dapat memberikan Logic Coba lagi solusi standar? Jawabannya adalah: Artinya, alat coba lagi berdasarkan pola desain agen. Kami mencoba menggunakan alat yang sesuai untuk merekonstruksi skenario di atas.
Definisi spesifik dari pola desain perintah tidak dijelaskan. Alasan utama adalah bahwa pola perintah dapat menyelesaikan logika operasi antarmuka dengan menjalankan objek, dan pada saat yang sama, enkapsulasi internal logika RETRY tidak terpapar pada detail implementasi. Untuk penelepon, ini adalah pelaksanaan logika normal dan mencapai tujuan decoupling. Silakan lihat implementasi fungsi spesifik. (Struktur Diagram Kelas)
Iretry setuju pada unggahan dan coba lagi antarmuka, yang mengimplementasikan ODPSretry seperti merangkum logika unggahan ODPS, dan merangkum mekanisme coba lagi dan coba lagi strategi pada saat yang sama. Pada saat yang sama, gunakan metode pemulihan untuk melakukan operasi pemulihan di akhir.
LogicClient penelepon kami tidak perlu memperhatikan coba lagi. Ini mengimplementasikan fungsi antarmuka konvensi melalui retryer retryer. Pada saat yang sama, Retryer perlu menanggapi dan memproses logika coba lagi. Pemrosesan ulang spesifik dari retryer diserahkan ke kelas implementasi antarmuka Irtry yang sebenarnya. Dengan mengadopsi mode perintah, logika normal dan logika coba lagi dipisahkan secara elegan, dan pada saat yang sama, logika normal dan logika coba lagi dipisahkan dengan membangun peran retryer, sehingga coba lagi memiliki skalabilitas yang lebih baik.
Spring-Retry adalah toolkit open source, yang saat ini tersedia versi 1.1.2.release, yang menyesuaikan Template Operasi Coba lagi, dan dapat menetapkan kebijakan Coba lagi dan kebijakan Fallback. Pada saat yang sama, coba lagi contoh eksekusi untuk memastikan keamanan utas. Contoh operasi spesifik adalah sebagai berikut:
unggah public void (peta akhir <String, Object> Map) melempar Exception {// Bangun Retry Template Instance RetryTemplate RetryTemplate = RetryTemplate baru (); // Atur kebijakan coba lagi, terutama atur jumlah retries SimpleretryPolicy Policy = new SimpleretryPolicy (3, koleksi. <Class <? Extends Throwable>, Boolean> singletonMap (Exception.class, true)); // Tetapkan kembali kebijakan operasi fallback, terutama atur interval ulang fixedFoleFfpolicy fixedFackPolicy = new fixedbackoffpolicy (); fixedbackoffpolicy.setBackOfFperiod (100); retrytemplate.setretrypolicy (kebijakan); retrytemplate.setBackOffpolicy (fixedbackoffpolicy); // RetryCallback Coba lagi contoh panggilan balik untuk membungkus logika logika normal, eksekusi pertama dan coba lagi adalah semua logika ini RetryCallback <object, Exception> retrycallback = retrycallback baru, Unify <) {// retrycontext contextext Context Contaction, Unify Spring-cry Objek wrappaping doWapping doWapping doWapping doWrret doWreta KONVENSI OPERASI OPERASI KONVENSI OPERASI, KONVENSI PREMPLE-CRY-CRY CRYDAP DOBAP DOWAPPRET DOWAPPRET DOWAPPRET DOBAP DOWAPPRET DOWAPPRET PUBLEK DOUPHRET DOUPTREX PUBLETREX System.out.println ("Do Something"); Pengecualian e = unggahtoodps (peta); System.out.println (context.getRetryCount ()); Lemparkan e; // Perhatikan poin ini. Akar coba lagi dikembalikan melalui pengecualian}}; // Kembalikan proses coba lagi biasanya berakhir atau mencapai batasan atas ulang. Final RecoveryCallback <BOCTICE> recoveryCallback = New RecoveryCallBack <BOMPERTIF> () {Public Object Recover (RetryContext Context) melempar Exception {System.out.println ("Do Recovery Operation"); kembali nol; }}; coba {// jalankan metode eksekusi dengan retrytemplate untuk memulai eksekusi logis retrytemplate.execute (retrycallback, recoverycallback); } catch (Exception e) {E.PrintStackTrace (); }}Setelah menganalisis kode kasus, RetryTemplate mengasumsikan peran Executor RETRY. Ini dapat mengatur SimpleretryPolicy (RETRY Policy, atur ulang batas atas, coba lagi entitas root), FixedBackOffpolicy (Kebijakan Fallback Tetap, Tetapkan Interval Waktu untuk Coba lagi Fallback). RetryTemplate mengeksekusi operasi melalui eksekusi, dan dua instance kelas, RetryCallback dan RecoveryCallback, diharuskan untuk menyiapkan dua instance kelas. Yang pertama sesuai dengan instance Logika Callback RETRY dan membungkus operasi fungsional normal. RecoveryCallback mengimplementasikan instance operasi pemulihan di akhir seluruh operasi eksekusi.
Eksekusi RetryTemplate aman-utas, dan logika implementasi menggunakan ThreadLocal untuk menyimpan konteks eksekusi RetryContext dari setiap contoh eksekusi.
Meskipun alat spring-retry dapat secara elegan menerapkan coba lagi, ada dua desain yang tidak ramah: satu adalah bahwa entitas coba lagi terbatas pada subclass yang dapat dilemparkan, menunjukkan bahwa coba lagi ditujukan untuk pengecualian fungsional yang tajam sebagai premis desain, tetapi kita ingin mengandalkan lemparan data sebagai bagian dari lemparan. Lain adalah objek pernyataan yang mencoba kembali akar penyebab menggunakan contoh pengecualian dari Dowithretry, yang tidak sesuai dengan desain pengembalian pernyataan internal normal.
Spring Retry Advocates Retrying Metode dalam Anotasi. Logika coba lagi dieksekusi secara sinkron. "Kegagalan" Retry ditargetkan untuk dilempar. Jika Anda ingin menentukan apakah Anda perlu mencoba lagi berdasarkan keadaan tertentu dari nilai pengembalian, Anda mungkin hanya dapat menilai nilai pengembalian sendiri dan kemudian secara eksplisit melemparkan pengecualian.
Abstraksi musim semi untuk coba lagi
"Abstrak" adalah kualitas yang diperlukan untuk setiap programmer. Bagi saya dengan kualifikasi yang biasa -biasa saja, tidak ada cara yang lebih baik untuk meningkatkan selain meniru dan memahami kode sumber yang sangat baik. Untuk melakukan ini, saya menulis ulang logika intinya ... mari kita lihat abstraksi Spring Retry untuk "coba lagi".
Spring Retry terkait antarmuka.jpg
Alat Retryer Guava mirip dengan pegas-retri. Ini membungkus normal logis coba lagi dengan mendefinisikan peran retryer. Namun, retryer jambu memiliki definisi kebijakan yang lebih baik. Atas dasar mendukung jumlah kali coba lagi dan coba lagi kontrol frekuensi, dapat kompatibel dengan definisi sumber coba lagi yang mendukung beberapa pengecualian atau objek entitas khusus, memberikan fungsi ulang lebih lanjut fleksibilitas. Retryer jambu juga aman. Logika panggilan masuk menggunakan metode panggilan java.util.concurrent.callable. Kode sampel adalah sebagai berikut:
public void unggahodps (peta akhir <string, objek> peta) {// retryerBuilder membangun retry instance retryer, Anda dapat mengatur sumber coba lagi dan mendukung beberapa sumber coba lagi, Anda dapat mengonfigurasi jumlah kali coba lagi atau retryer (dan Anda dapat mengkonfigurasi interval waktu tunggu <boolean> retryer (retryer = retryer (Anda dapat mengonfigurasi booleer <boolean> retryer (retryer = retryer (Anda dapat mengkonfigurasi interval booleer <boolean> retryer (retryer = retryer. .retryifeexception () .// Set Exception Retry Source RetryifResult (predikat baru <Boolean> () {// Setel Sumber Segmen Kustom, @Override Public Boolean Apply (State Boolean) {// Catatan Khusus: Ini berlaku pengembalian true, yang berarti bahwa RETRY perlu dibedakan dari semoga logika. .withstopstrategy (stopstrategies.stopafterattempt (5)) // atur ulang 5 kali, dan Anda juga dapat mengatur waktu batas waktu.withwaitstrategy (waitstrategies.fixedwait (100L, timeunit.milliseconds)). Build (); // atur setiap interval retry coba {// the retry). java.util.concurrent.callable <v>, jadi eksekusi adalah hasil boolean yang aman = retryer.call (baru dapat dipanggil <boolean> () {@override public call () lempar {try {// catatan khusus: Kembalikan pernyataan palsu tidak memerlukan retry, pernyataan return return untuk melanjutkan retry retry unggahan { / Pengecualian (e);}}}); } catch (ExecutionException e) {} catch (retryexception ex) {}}Analisis Prinsip Kode Sampel:
RetryerBuilder adalah pembuat pabrik yang dapat menyesuaikan sumber coba lagi dan dapat mendukung beberapa sumber coba lagi, dapat mengonfigurasi jumlah waktu coba lagi atau coba lagi, dan dapat mengkonfigurasi interval waktu tunggu untuk membuat instance retryer retryer.
Sumber coba lagi RetryerBuilder mendukung objek pengecualian pengecualian dan objek pernyataan khusus, dan ditetapkan melalui retryifexception dan retryifResult, mendukung banyak dan kompatibel pada saat yang sama.
Waktu tunggu dan coba lagi konfigurasi retryerBuilder diimplementasikan menggunakan kelas kebijakan yang berbeda, dan fitur waktu tunggu dapat mendukung mode interval yang tidak interval dan tetap.
Retryer adalah instance dari retryer, yang mengeksekusi logika operasi melalui metode panggilan, dan merangkum operasi sumber ulang.
Coba lagi kesamaan dan prinsip yang elegan
Normal dan coba lagi dipisahkan secara elegan, coba lagi menyatakan bahwa instance bersyarat atau instance pengecualian logis adalah media untuk komunikasi antara keduanya.
Setuju dengan coba lagi interval, strategi coba lagi diferensial, dan atur ulang waktu batas waktu untuk lebih memastikan efektivitas coba lagi dan stabilitas proses coba lagi.
Semua menggunakan pola desain perintah, dan operasi logis yang sesuai diselesaikan dengan mendelegasikan objek coba lagi, dan logika coba lagi diimplementasikan secara internal.
Alat Spring-Tryer dan Guava-Tryer keduanya aman dan aman dan dapat mendukung kebenaran Logic Retry dalam skenario bisnis bersamaan.
Skenario yang berlaku untuk coba lagi dengan anggun
Ada skenario ketergantungan yang tidak stabil dalam logika fungsional, dan perlu menggunakan coba lagi untuk mendapatkan hasil yang diharapkan atau mencoba untuk mengeksekusi ulang logika tanpa berakhir segera. Misalnya, akses antarmuka jarak jauh, akses beban data, verifikasi unggahan data, dll.
Ada skenario yang perlu dikembalikan untuk skenario pengecualian, dan pada saat yang sama, diharapkan untuk memisahkan logika normal dan logika coba lagi.
Untuk interaksi berdasarkan media data, coba lagi skema juga dapat dipertimbangkan dalam skenario yang memerlukan pemulihan ulang untuk mendeteksi logika eksekusi.
Di atas adalah semua penjelasan terperinci dari contoh pemrograman Java Coba lagi. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!