يدرس هذه المقالة بشكل أساسي شرحًا مفصلاً لآلية إعادة إعادة محاكاة برمجة Java وأمثلة الشفرة ذات الصلة المشتركة. يعتقد المحرر أنه جيد جدًا وله قيمة مرجعية معينة. يمكن للأصدقاء الذين يحتاجون إليها الرجوع إليها.
يجب تنفيذ الوظيفة في التطبيق: يجب تحميل البيانات على خدمة التخزين عن بُعد ، ويتم تنفيذ العمليات الأخرى عندما تكون معالجة الإرجاع ناجحة. هذه الوظيفة ليست معقدة ويتم تقسيمها إلى خطوتين: الخطوة الأولى هي استدعاء غلاف منطق خدمة الراحة عن بُعد لإرجاع نتيجة المعالجة إلى طريقة المعالجة ؛ الخطوة الثانية هي الحصول على نتيجة الخطوة الأولى أو التقاط الاستثناء. في حالة حدوث خطأ أو استثناء ، سيتم إعادة إعادة إعادة تحميل منطق التحميل ، وإلا فإن العملية المنطقية ستستمر.
استنادًا إلى منطق التحميل العادي ، يتم تنفيذ منطق الوظيفة عن طريق الحكم على ما إذا كانت نتيجة الإرجاع أو الاستماع إلى قرار الاستثناء هي إعادة محاولة إعادة المحاولة. في الوقت نفسه ، من أجل حل التنفيذ غير الصحيح لإعادة المحاولة الفورية (على افتراض أن الاستثناء ناتج عن عدم استقرار التنفيذ الخارجي) ، فإن منطق الوظيفة هو إعادة الاستخدام لوقت تأخير معين.
public void commonrtry (Map <String ، Object> datamap) يلقي InterruptedException {map <string ، Object> parammap = maps.newhashmap () ؛ parammap.put ("tablename" ، "creativetable") ؛ parammap.put ("DS" ، "20160220") ؛ parammap.put ("datamap" ، datamap) ؛ نتيجة منطقية = خطأ ؛ حاول {result = uploadtoodps (parammap) ؛ if (! نتيجة) {thread.sleep (1000) ؛ uploadtoodps (parammap) ؛ // حاول مرة واحدة}} catch (استثناء e) {thread.sleep (1000) ؛ uploadtoodps (parammap) ؛ // حاول مرة واحدة}}قد لا يزال الحل أعلاه غير صالح لإعادة المحاولة. لحل هذه المشكلة ، حاول زيادة عدد الفاصل الزمني لإعادة المحاولة لتحقيق إمكانية زيادة إعادة المحاولة.
public void commonrtry (Map <String ، Object> datamap) يلقي InterruptedException {map <string ، Object> parammap = maps.newhashmap () ؛ parammap.put ("tablename" ، "creativetable") ؛ parammap.put ("DS" ، "20160220") ؛ parammap.put ("datamap" ، datamap) ؛ نتيجة منطقية = خطأ ؛ حاول {result = uploadtoodps (parammap) ؛ إذا (! النتيجة) {reuploadtoodps (parammap ، 1000l ، 10) ؛ // تأخير إعادة إعادة rotry}} catch (استثناء e) {reuploadtoodps (parammap ، 1000l ، 10) ؛هناك مشكلة في الحل 1 والحل 2: المنطق العادي والمنطق إعادة المحاولة مقترنة بقوة. يعتمد منطق إعادة المحاولة إلى حد كبير على نتائج تنفيذ المنطق الطبيعي ، وتشغيل إعادة المحاولة السلبية للنتائج المتوقعة للمنطق العادي. غالبًا ما يتم غمر السبب الجذري لإعادة المحاولة من خلال المنطق المعقد ، مما قد يؤدي إلى فهم غير متناسق لمشكلات حل العمليات والصيانة اللاحقة. من الصعب ضمان إعادة المحاولة ، ولا يفضي إلى تشغيلها والصيانة ، لأن تصميم إعادة المحاولة يعتمد على استثناءات المنطق العادية أو إعادة محاولة السبب الجذري للتخمين.
لذلك هل هناك حل يمكن استخدامه لفصل منطق المنطق والمعالجة الطبيعي ، وفي الوقت نفسه ، يمكن أن يعطي منطق إعادة المحاولة حلاً موحدًا؟ الجواب هو: أي أداة إعادة بناء تستند إلى نمط تصميم الوكيل. نحاول استخدام الأداة المقابلة لإعادة بناء السيناريو أعلاه.
لم يتم شرح التعريف المحدد لنمط تصميم الأوامر. السبب الرئيسي هو أن نمط الأوامر يمكنه إكمال منطق تشغيل الواجهة عن طريق تنفيذ الكائن ، وفي الوقت نفسه ، لا يتعرض التغليف الداخلي لمنطق إعادة المحاولة لتفاصيل التنفيذ. بالنسبة للمتصل ، فإن تنفيذ المنطق العادي وتحقيق هدف الفصل. يرجى الاطلاع على تطبيق الوظيفة المحددة. (بنية مخطط الفصل)
يوافق IRETER على واجهة التحميل وإعادة المحاولة ، والتي تنفذ تشبه ODPSRETRY تغلف منطق تحميل ODPS ، ويغلف آلية إعادة المحاولة وإعادة المحاولة في نفس الوقت. في الوقت نفسه ، استخدم طريقة الاسترداد لإجراء عملية الاسترداد في النهاية.
لا يحتاج Caller LogicClient إلى الانتباه إلى إعادة المحاولة. ينفذ وظيفة واجهة الاتفاقية من خلال إعادة إعادة المحاولة. في الوقت نفسه ، تحتاج Retryer إلى الاستجابة ومعالجة منطق إعادة المحاولة. يتم تسليم المعالجة المحددة لإعادة إعادة المحاولة إلى فئة تنفيذ واجهة IRTRY الحقيقية ODPSRETRY. من خلال تبني وضع الأوامر ، يتم فصل المنطق العادي والمنطق إعادة المحاولة بأناقة ، وفي الوقت نفسه ، يتم فصل المنطق العادي والمنطق إعادة المحاولة عن طريق بناء دور إعادة المحاولة ، بحيث تكون إعادة التوسع أفضل.
Spring-Retry عبارة عن مجموعة أدوات مفتوحة المصدر ، الإصدار 1.1.2ise ، والذي يتوفر حاليًا ، والذي يقوم بتخصيص قالب عملية إعادة المحاولة ، ويمكنه تعيين سياسات إعادة المحاولة وسياسات الاحتياطية. في الوقت نفسه ، قم بإعادة محاولة تنفيذ مثيل التنفيذ لضمان سلامة مؤشرات الترابط. أمثلة التشغيل المحددة هي كما يلي:
تحميل الفراغ العام (الخريطة النهائية <سلسلة ، كائن> خريطة) يلقي الاستثناء {// إنشاء مثيل قالب إعادة المحاولة receplate receplate = new receptemplate () ؛ // قم بتعيين سياسة إعادة المحاولة ، وضبط عدد عمليات إعادة المحاكاة بشكل أساسي على سياسة SomplerTryPolicy = New SimplerTryPolicy (3 ، مجموعات. <الفئة <؟ // قم بتعيين سياسة عملية إعادة المحاكاة ، وضبط بشكل أساسي Retry InterbackOffPolicy FixedBackOffPolicy = new FixedBackOffPolicy () ؛ ثابتة backoffpolicy.setbackoffperiod (100) ؛ receplate.setRetryPolicy (السياسة) ؛ receptemplate.setbackoffpolicy (flexbackoffpolicy) ؛ // RETRYCALLBACK ROTRY مثيل رد الاتصال للف المنطق المنطقي العادي ، أول تنفيذ وتنفيذ إعادة المحاولة هي كل هذا المنطق إعادة إعادة المحاكاة النهائية <Object ، استثناء> RETRYCALLBACK = NEW RETRYCALLBACK <OBJECT ، استثناء> () {// RETRYCONTEX System.out.println ("افعل شيئًا") ؛ استثناء e = uploadtoodps (MAP) ؛ system.out.println (context.getRetryCount ()) ؛ رمي e ؛ // إيلاء اهتمام خاص لهذه النقطة. يتم إرجاع جذر إعادة المحاولة من خلال استثناء}} ؛ // استرداد عملية إعادة المحاولة تنتهي عادة أو تصل إلى الحد الأعلى لإعادة المحاولة. RecoveryCallback النهائي <Object> RecoveryCallback = New RecoveryCallback <Object> () {الكائن العام Recovery (RetryContext Context) يلقي الاستثناء {system.out.println ("Do Recovery Operation") ؛ العودة لاغية. }} ؛ حاول {// تنفيذ طريقة التنفيذ عن طريق إعادة receplate لبدء التنفيذ المنطقي لـ receplate.execute (RetryCallback ، RecoveryCallback) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}بعد تحليل رمز القضية ، تتولى RetryTemplate دور المنفذ إعادة المحاولة. يمكن أن تضع SimplerTryPolicy (سياسة إعادة إعادة المحاولة ، تعيين الحد الأعلى لإعادة المحاولة ، كيان Retry Root) ، FixedBackOffPolicy (سياسة الاحتياط الثابت ، قم بتعيين الفاصل الزمني لاستبداد إعادة المحاولة). RetryTemplate ينفذ العمليات من خلال التنفيذ ، واثنان من حالات الفصل ، RetryCallback و RecoveryCallback ، مطلوبة لإعداد حالتين في الفصل. السابق يتوافق مع مثيل منطق رد الاتصال Retry ويلتف العمليات الوظيفية العادية. ينفذ RecoveryCallback مثيل عملية الاسترداد في نهاية عملية التنفيذ بأكملها.
إن تنفيذ RetryTemplate آمن مؤشر ترابط ، ويستخدم منطق التنفيذ ThreadLocal لحفظ سياق تنفيذ إعادة إعادة المحاكاة لكل مثيل تنفيذ.
على الرغم من أن أداة استرجاع الربيع يمكنها تنفيذ إعادة المحاولة بأناقة ، إلا أن هناك تصميمين غير وديين: أحدهما هو أن كيان إعادة المحاولة يقتصر على الفئة الفرعية القابلة للإرهاب ، مما يشير إلى أن إعادة المحاولة تهدف إلى استثناءات وظيفية للتصميم ، لكننا نرغب في الاعتماد على كيان كائن البيانات ككيان إعادة المحاولة ، يجب أن يكون رابطة الربيع قد تم إلقاؤها إلى المزيج القابل للإحساس. والآخر هو كائن التأكيد الذي يقوم بإعادة محاكمة السبب الجذري يستخدم مثيل استثناء الاستثناء من dowithretry ، والذي لا يتوافق مع تصميم عودة التأكيدات الداخلية العادية.
يدعو ربيع المحاكاة إلى إعادة إعادة المحاولة في التعليقات التوضيحية. يتم تنفيذ منطق إعادة المحاولة بشكل متزامن. يستهدف "فشل" إعادة المحاولة. إذا كنت ترغب في تحديد ما إذا كنت بحاجة إلى إعادة المحاولة بناءً على حالة معينة من قيمة الإرجاع ، فقد تتمكن فقط من الحكم على قيمة الإرجاع بنفسك ثم رمي استثناء بشكل صريح.
تجريد الربيع من أجل إعادة المحاولة
"Abstract" هي جودة ضرورية لكل مبرمج. بالنسبة لي مع مؤهلات متواضعة ، لا توجد طريقة أفضل للتحسين من تقليد وفهم رموز المصدر الممتازة. للقيام بذلك ، أعيد كتابة منطقها الأساسي ... دعونا نلقي نظرة على تجريد Retry Retry لـ "Retry".
واجهات الربيع ذات الصلة. jpg
تشبه أداة إعادة Retryer الجوافة مع استرداد الربيع. يلف إعادة المحاولة المنطقية الطبيعية عن طريق تحديد دور إعادة المحاولة. ومع ذلك ، فإن إعادة محيط الجوافة لديها تعريف سياسة أفضل. على أساس دعم عدد أوقات إعادة المحاولة والتحكم في تردد إعادة المحاولة ، يمكن أن يكون متوافقًا مع تعريف مصدر إعادة المحاولة الذي يدعم استثناءات متعددة أو كائنات كيان مخصصة ، مما يمنح وظيفة إعادة المحاولة مزيدًا من المرونة. إعادة ريترير الجوافة آمنة أيضًا. يستخدم منطق مكالمة الإدخال طريقة استدعاء java.util.concurrent.callable. رمز العينة كما يلي:
public void uploadodps (الخريطة النهائية <سلسلة ، كائن> خريطة) {// rotryerBuilder قم بإنشاء مثيل Retry Retryer ، يمكنك تعيين مصدر إعادة المحاولة ودعم مصادر إعادة محاكاة متعددة ، يمكنك تكوين عدد أوقات إعادة المحاولة أو مهلة إعادة المحاولة ، ويمكنك تكوين Retryer time vertal <BooleAner> retryerbuilder .retryifexception () .// تعيين استثناء Retry Source RetryIfResult (مسند جديد <Ololean> () {// Set Set Sest Segment Source Source ، يعني Override Boolean Public Apply (الحالة المنطقية) . whithstopstrategy (stopstrategies.stopafterattempt (5)) // ضبط إعادة المحاولة 5 مرات ، ويمكنك أيضًا تعيين وقت إعادة المحاولة. java.util.concurrent.callable <v> ، وبالتالي فإن التنفيذ هو النتيجة المنطقية الآمنة مؤشرات الترابط = Retryer.Call (جديد قابل للاتصال <Oloan> () { @ @ @override boolean call () رمي الاستثناء {try {// ملاحظة خاصة: إرجاع بيان كاذب لا يتطلب إعادة البيان الحقيقي للاستمرار في إعادة المحملة (map) استثناء (هـ) ؛}}) ؛ } catch (ExecutionException e) {} catch (RetryException ex) {}}نموذج تحليل مبدأ الكود:
RetryerBuilder هو منشئ المصنع يمكنه تخصيص مصدر إعادة المحاولة ويمكنه دعم مصادر إعادة محاكاة متعددة ، ويمكنه تكوين عدد أوقات إعادة المحاولة أو مهلة إعادة المحاولة ، ويمكنه تكوين الفاصل الزمني لوقت الانتظار لإنشاء مثيل Retryer.
يدعم مصدر إعادة RetryerBuilder كائنات استثناء الاستثناء وكائنات التأكيد المخصصة ، ويتم تعيينها من خلال RetryFexception و Retryifresult ، وهو يدعم المتعددة ومتوافق في نفس الوقت.
يتم تنفيذ تكوين وقت الانتظار وحد إعادة إعادة المحاولة لـ RetryerBuilder باستخدام فئات سياسة مختلفة ، ويمكن لميزات وقت الانتظار دعم أوضاع الفاصل الزمني غير المؤلف والثابت.
Retryer هو مثيل لإعادة المحاولة ، التي تنفذ منطق العملية من خلال طريقة المكالمات ، وتغلف عملية مصدر إعادة المحاولة.
إعادة المحاولة الأنيقة والمبدأ المشترك
طبيعية وإعادة رضا أنيقة ، إعادة محاولة تأكيد أن مثيلات مشروطة أو مثيلات الاستثناء المنطقي هي الوسائط للاتصال بين الاثنين.
اتفق على فترات إعادة المحاولة ، واستراتيجيات إعادة المحاولة التفاضلية ، وتحديد وقت إعادة المحاولة لضمان فعالية إعادة المحاولة واستقرار عملية إعادة المحاولة.
يستخدم الجميع نمط تصميم الأوامر ، ويتم الانتهاء من العمليات المنطقية المقابلة عن طريق تفويض كائن إعادة المحاولة ، ويتم تنفيذ منطق إعادة المحاولة داخليًا.
تعد أدوات Spring-Tryer و Goava-Tryer كلاهما إعادة محاكمة آمنة للخيط ويمكن أن تدعم صحة منطق إعادة المحاولة في سيناريوهات الأعمال المتزامنة.
السيناريوهات المعمول بها لإعادة المحاولة بأمان
هناك سيناريوهات التبعية غير المستقرة في المنطق الوظيفي ، ومن الضروري استخدام إعادة المحاولة للحصول على النتيجة المتوقعة أو محاولة إعادة الاستمرار في المنطق دون إنهاء على الفور. على سبيل المثال ، الوصول إلى الواجهة عن بُعد ، وصول البيانات ، والتحقق من تحميل البيانات ، إلخ.
هناك سيناريوهات تحتاج إلى إعادة إعادة محيطها لسيناريوهات الاستثناء ، وفي الوقت نفسه ، من المأمول فصل المنطق العادي ومنطق إعادة المحاولة.
بالنسبة للتفاعلات المستندة إلى وسائط البيانات ، يمكن أيضًا النظر في مخططات إعادة المحاولة في السيناريوهات التي تتطلب استطلاع إعادة المحاولة للكشف عن منطق التنفيذ.
ما ورد أعلاه هو كل التفسير التفصيلي لمثال آلية إعادة محاولة إعادة محاكاة برمجة Java. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!