From 9d55c8994fa872cb2e4a8469f4f3a6b1612b57b4 Mon Sep 17 00:00:00 2001 From: wangjiashuo <1443062665@qq.com> Date: Sun, 31 May 2026 13:51:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20w11=20URL=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=BC=82=E5=B8=B8=E4=B8=8E=E9=87=8D=E8=AF=95=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w11/RetryUtils$RetryTask.class | Bin 0 -> 431 bytes w11/RetryUtils.class | Bin 0 -> 2504 bytes w11/RetryUtils.java | 41 ++++++++++++++++++++++ w11/UrlFormatException.class | Bin 0 -> 604 bytes w11/UrlFormatException.java | 60 +++++++++++++++++++++++++++++++++ w11/UrlValidator.class | Bin 0 -> 2166 bytes w11/思考题.txt | 15 +++++++++ 7 files changed, 116 insertions(+) create mode 100644 w11/RetryUtils$RetryTask.class create mode 100644 w11/RetryUtils.class create mode 100644 w11/RetryUtils.java create mode 100644 w11/UrlFormatException.class create mode 100644 w11/UrlFormatException.java create mode 100644 w11/UrlValidator.class create mode 100644 w11/思考题.txt diff --git a/w11/RetryUtils$RetryTask.class b/w11/RetryUtils$RetryTask.class new file mode 100644 index 0000000000000000000000000000000000000000..e43623a1c45e6c51b18c712e961e99a8ccfe7812 GIT binary patch literal 431 zcmZXQ!A`V0WOvRJpKyEXV~9(({F$~e@7 z8ad7EH#7e~J73=)p8!TU@=+mlr|h!#2d5KzTBMP(&pxVz)>6HxL88oJa6eyi>=k4m XO^KfLv?LxBtc|Y3P#B?&LofINzEW%Q literal 0 HcmV?d00001 diff --git a/w11/RetryUtils.class b/w11/RetryUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..5e1b472dcd1745cb51a2d1b9155ef02dd06d3039 GIT binary patch literal 2504 zcmcIm-BTM?6#w1uvB|P+Xi7_gmO>jaU=7u3RT5D^u%VF7dn{&@S=iJ}8F*UR2R8}+Wn4RTnIwZr3Jqnu8OpsIDj&jRV zQ(HigwPvJ3KH_7qf_-RZXiTfKe9$x!sy(6EGbCBIYSijfAYq2B|!{*s+E@SiLW_3i!qY9qIa}3)Oxonmj z_C~PsIy+h_ND#dWLZZ<;l)4j9!V3(|#jVD2hOMP}$u?oUDBANShCQW3QB?D?I<51N zz&pUOzZfK<>pZ3EFH0SCfz`PY-nntKN6pc#u(TL5xvojcM4UM6xl;F05 zEEo*7ITmivjZ}BUsd#w;+ zP}TLAX7dmwcv;33%t?4l!P|I;;lP%ZM)Rd1yy}IGgzD0zvp@g;^d6ae*`mW}DK%xw zdEOpH2_3J9Vessru38os{lEEQNw~_;v4x*Xm6UL;?4m5gP$)XRp-$P+PCe$LGwMP! zVu;hdekMQbp!ql^Hs@ziO)|a6G)|JmKKfmei`A(rkVxxt=xP#zl{D#-{1mn_ZXo$i6f*D z7)R(02kL01kj3`Ag%|at-GN3LJFyc1dfyLYH(h#-i=iX=U$ z=O|JqY9GMGj!W=9KogA*NmVUDW+W495{~?h9WJ~^wt_@2UMIT+DR*d zJ9!DO0E-xzD6%U45&?d)4-})+%i?Azcn67V@$nH)z7xcvAjNlT0b?tqb!y{8>42N| zDq^X|G+DTipnM#BGB`=Cgf&B+7xLpwe!PfFw2zK7ecvS;@yLry>b+VI-p2>{5KaFA DUSyTb literal 0 HcmV?d00001 diff --git a/w11/RetryUtils.java b/w11/RetryUtils.java new file mode 100644 index 0000000..f2d7f46 --- /dev/null +++ b/w11/RetryUtils.java @@ -0,0 +1,41 @@ +public class RetryUtils { + private static final long BASE_WAIT_MS = 500; + private static final int MAX_RETRY = 5; + + @FunctionalInterface + public interface RetryTask { + T execute() throws Exception; + } + + public static T retry(RetryTask task) throws Exception { + int attempt = 0; + while (attempt < MAX_RETRY) { + try { + return task.execute(); + } catch (Exception e) { + attempt++; + if (attempt >= MAX_RETRY) { + System.out.println("最终失败: " + e.getMessage()); + throw e; + } + long waitTime = BASE_WAIT_MS * (1L << attempt); + System.out.println("尝试执行 #" + attempt + "... 失败"); + System.out.println("等待: " + waitTime + "ms"); + try { + Thread.sleep(waitTime); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new RuntimeException(ie); + } + } + } + throw new IllegalStateException("重试逻辑异常"); + } + + public static void main(String[] args) throws Exception { + RetryUtils.retry(() -> { + System.out.println("尝试执行"); + throw new RuntimeException("模拟失败"); + }); + } +} diff --git a/w11/UrlFormatException.class b/w11/UrlFormatException.class new file mode 100644 index 0000000000000000000000000000000000000000..07c41d1ebf6d7abb8352529aa6b3b91a10f70efa GIT binary patch literal 604 zcma)3!A`cb~?57K>0a z7#$%+e8Ety_kVDMI1_cjW8VKnvP)Cfz+g%^kk^$4*!McHwb zmlA`!MJ2@;-bdl1HwrjOGo1VlUYlglFT)9EDD{Qp*YoL!M?*D*q4Td1zd9)TJibc3 zu2OHLu!#W%YY@((G4BZ_S=-F$OeKqB%2J~rqL5UYw9C*wiyd0abZV+^qgrsAOE91J0^t5GmV%>< zALGc3AYRC*%;>;)!RU-Iz*sw_%AFVf4jRf8|G@Ft-3TeEju&}9PR=>cInO!o*+2i9 z`W?Vt*ec3UuAoB00#phtJZqdY^ps%@>xTx<%A_Muxx=(fXQx1UIFe8iK$QYjLp8KH z>itgEw1x!~Gq;EKqn`dT1+@af!`W1qolP6g-t$SBaZK9^V4*i$mI`QuN*F0~$Z+heKs6Cg_wF7T z*xPqdV5#q5%rR4XRu0SadavO)GHbRRWD3bg3S*V-m>`N!Oc;1B{Ot z*?#%%n6#2I7Ab-0@r?+x8fz4+)zIX!R{~Sedj^vWpjjZwB=R?=XQr=`teGz_^4>OQ%QX za>lR}s1Fxt_IkD8I>?^x)UXS?Np9L0m2ulj8qN{Z8R04C7?zV0Xr3>q(%y2R;~HLf zp=$_z!197(g9Rbb8Nfc~uRi(id)A{kj{pt`EIQ+4+I3x?H`1Auj3(`L0B^eb`JaDy zeDn5P{T_kkUIA$_K0Y2TveGlmHh@Evp9S!i!2VNV&!Y2vcZ<;Q_=)kh zlda(sQU4HW4f7D)u&eV_$GYZr{bK9dwv#Os`2znQ>1=X4zhA=u4zq3yGh?R6Zri_8 zRQf7n0u^z4h-P)&rX>%Kr3Ynpz!-EL)$}_?aM5(M#E=S!GYW>?h8YoPdOmMV>zq9*b-%0p9_liZoG2FrzA2`rpy(s- zH>{zQ%r$k}_UKqcs*Zm5jRq)e$$bxf_A{NWHz2M zaygk(z!AKzB&Yd8RluRJ^1oI29q{u)i0`zF4^3d1J9Bxe;E!JqN)kM+;4WNA%dZf3 zc@Q|l)%_bZt#V&D&#vkqO)6LBoxn!+_ZE8E ziY&I#UpqZ+$3^mg1u>7JMW{TYpl0PEcX3a3ggE}JlB>Pq09C=>N%Y-E{fpIXVB{wl cSs6~^6!%)5k~BK)tp-fWRNl`b1q)06258Sm0RR91 literal 0 HcmV?d00001 diff --git a/w11/思考题.txt b/w11/思考题.txt new file mode 100644 index 0000000..d7d5331 --- /dev/null +++ b/w11/思考题.txt @@ -0,0 +1,15 @@ +URL返回404时是否继续重试?如何优化? + +结论:不应该继续重试。 + +- 404(Not Found)表示资源永久不存在,重试不会改变结果,只会浪费系统资源。 + +优化方案: + +1. 在重试逻辑中增加状态码判断:将404、401、403等永久失败状态码加入黑名单,遇到这些状态直接终止重试。 +​ +2. 扩展  RetryUtils :支持可配置的重试条件,如只重试5xx错误、连接超时等临时错误。 +​ +3. 断路器联动:当某个URL连续返回404时,直接将其加入熔断名单,后续请求直接拦截,避免无效调用。 +​ +4. 缓存404结果:对返回404的URL进行本地缓存,一段时间内不再发起请求。 \ No newline at end of file