في المدونة السابقة ، قدمنا استخدام Retry Spring. توضح هذه المقالة مبدأ التنفيذ لإعادة محاكاة الربيع من خلال مثال بسيط. تحتوي التعليقات التوضيحية المحددة في المثال فقط على عدد سمات إعادة المحاولة. في الواقع ، يمكن أن تضع التعليقات التوضيحية في إعادة محاولة الربيع المزيد من السمات. من أجل شرح المبدأ ، يكون الأمر أكثر بساطة. لإعادة محاكاة الربيع ، يمكنك التحقق من المستندات والمدونات ذات الصلة.
تعريف التعليقات التوضيحية
package rotry.annotation ؛ استيراد java.lang.annotation.* ؛/*** تم إنشاؤه بواسطة jack.wu في 2016/9/30. */@target (elementType.method) retention (attreentionpolicy.runtime) documentedpublicpublic@interface receplable {int maxattemps () default 0 ؛}تنفيذ الوكيل
باستخدام CGLIB كأداة وكيل ، اكتب أولاً تطبيق رد الاتصال ، وهو أيضًا المنطق الأساسي لتطبيق إعادة المحاولة.
package receptor */annotationawareretryOperationsInterceptor من الفئة العامة تنفذ methodInterceptor {// سجل عدد عمليات إعادة المحاكاة الخاصة بـ int = 0 ؛ Override اعتراض الكائن العام (Object OBJ ، الطريقة ، الكائن [] args ، methodproxy proxy) يلقي رمي {// الحصول على التعليق التوضيحي القابل لإعادة إعادة المحاولة في الطريقة المعتقة القابلة لإعادة إعادة إعادة إعادة retry = method.getAnnotation (retry.class) ؛ if (retryable == null) {return proxy.invokesuper (obj ، args) ؛ } آخر {// مع التعليق التوضيحي القابل لإعادة إعادة المحاولة ، إضافة استثناء منطق int maxattemps = retryable.maxattemps () ؛ حاول {return proxy.invokesuper (obj ، args) ؛ } catch (throwable e) {if (times ++ == maxattemps) {system.out.println ("تم الوصول إلى عمليات إعادة المحاكاة القصوى:" + maxattemps + "، لا مزيد من إعادة المحاولة!") ؛ } آخر {system.out.println ("call" + method.getName () + "استثناء طريقة ، ابدأ" + مرات + "إعادة المحاولة ...") ؛ // لاحظ أن هذه ليست طريقة Invokesuper ، ستخرج Invokesuper من Proxy.invoke (OBJ ، args) ؛ }}} return null ؛ }}ثم اكتب فئة وكيل واستخدم EnoTationAwAretryPrationsInterceptor كمقاطع
package recept. */الفئة العامة springretryproxy {public object newProxyInstance (Object Target) {ensancer ensancer = new ensancer () ؛ ensancer.SetSuperClass (target.getClass ()) ؛ ensancer.setCallback (التعليقات التوضيحية الجديدة areAretryOprationsInterceptor ()) ؛ إرجاع ensancer.create () ؛ }}امتحان
اختبر الكود أعلاه من خلال طريقة العمل المتعلقة بالمستخدم
تعريف الواجهة:
حزمة واجهة ؛/*** تم إنشاؤها بواسطة jack.wu في 2016/9/26. */واجهة عامة userFacade {void add () رمي الاستثناء ؛ استعلام باطل () رمي الاستثناء ؛}تطبيق الواجهة: واجهة الحزمة.
استيراد واجهة. userfacade ؛ import receply.annotation.retryable ؛/*** تم إنشاؤه بواسطة jack.wu في 2016/9/26. */الفئة العامة userfacadeimpl تنفذ userfacade {Override public void add () rems {system.out.println ("إضافة المستخدم ...") ؛ رمي new RunTimeException () ؛ } OverRide @retryable (maxattemps = 3) public void query () {system.out.println ("Query user ...") ؛ رمي new RunTimeException () ؛ }}امتحان:
الفئة العامة الرئيسية {public static void main (string [] args) يلقي الاستثناء {userfacadeimpl user = جديد userfacadeimpl () ؛ // SpringRetry Proxy Test SpringRetryProxy SpringRetryProxy = new SpringRetryProxy () ؛ userfacade u = (userfacade) SpringRetryProxy.newproxyinstance (user) ؛ //u.add() ؛//no إعادة المحاولة U.Query () ؛ // فشل إعادة المحاولة}} لا تضيف طريقة الإضافة تعليقات توضيحية لإعادة المحاولة ، وينتهي البرنامج بشكل غير طبيعي ، وتضيف طريقة الاستعلام التعليقات التوضيحية للمحاكاة ، ومجموعة Retry 3 مرات ، وتأثير التشغيل كما يلي على النحو التالي
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.