מדריך לאביב מחדש

1. סקירה כללית

Spring Retry מספק יכולת להפעיל מחדש באופן אוטומטי פעולה כושלת. זה מועיל כאשר השגיאות עשויות להיות חולפות (כמו תקלה ברשתית רגעית).

במדריך זה נראה דרכים שונות לשימוש בספרינג חוזר: הערות, נסה שוב את התבנית, ושיחות חוזרות.

2. תלות Maven

נתחיל ב הוספת ה- נסה שוב לאביב תלות שלנו pom.xml קוֹבֶץ:

 org.springframework.retry spring-retry 1.2.5.RELEASE 

אנחנו גם צריכים להוסיף AOP אביב לפרויקט שלנו:

 org.springframework אביב-היבטים 5.2.8.RELEASE 

בדוק את Maven Central עבור הגרסאות העדכניות ביותר של תלות באביב וניסוח האביב.

3. הפעלת Spring Springry

כדי להפעיל את Spring Spring שוב ביישום, אנחנו צריכים להוסיף את @EnableRetry ביאור שלנו @תְצוּרָה מעמד:

@Configuration @EnableRetry מחלקה ציבורית AppConfig {...}

4. שימוש ב- Spring Retry

4.1. @Retryable ללא התאוששות

כדי להוסיף פונקציות לנסות מחדש לשיטות, אנו יכולים להשתמש ב- @Retryable ביאור:

ממשק ציבורי @Service MyService {@Retryable (value = RuntimeException.class) void retryService (SQL String); }

בדוגמה זו, מנסים לנסות שוב כאשר א חריגת זמן ריצה נזרק.

לְכָל @Retryableהתנהגות ברירת המחדל, ניסיון חוזר עשוי להתרחש עד שלוש פעמים, תוך עיכוב של שנייה אחת בין ניסיון נוסף.

4.2. @Retryable ו @לְהַחלִים

בואו כעת נוסיף שיטת התאוששות באמצעות ה- @לְהַחלִים ביאור:

ממשק ציבורי @ שירות MyService {@Retryable (value = SQLException.class) בטל retryServiceWithRecovery (מחרוזת sql) זורק SQLException; התאוששות בטל @ שחזור (SQLException e, מחרוזת sql); }

בדוגמה זו, מנסים לנסות שוב כאשר SQLException נזרק.ה @לְהַחלִים ביאור מגדיר שיטת התאוששות נפרדת כאשר א @Retryable השיטה נכשלת בחריג שצוין.

כתוצאה מכך, אם retryServiceWithRecovery שיטה ממשיכה לזרוק א SqlException אחרי 3 ניסיונות, ה- לְהַחלִים() השיטה תיקרא.

על המטפל בשחזור להיות הפרמטר הראשון מהסוג זורק (אופציונלי) ואותו סוג החזרה.הטיעונים הבאים מאוכלסים מרשימת הארגומנטים של השיטה שנכשלה באותו סדר.

4.3. התאמה אישית @ ניתן לניסיון חוזר התנהגות

על מנת להתאים אישית את ההתנהגות של ניסיון חוזר, אנחנו יכולים להשתמש בפרמטרים מקס נסיונות ו התרחק:

ממשק ציבורי @Service MyService {@Retryable (value = SQLException.class, maxAttempts = 2, backoff = @Backoff (delay = 100)) void retryServiceWithCustomization (String sql) זורק SQLException; }

בדוגמה שלעיל יהיו עד 2 ניסיונות ועיכוב של 100 אלפיות השנייה.

4.4. שימוש במאפייני אביב

אנו יכולים גם להשתמש במאפיינים ב- @Retryable ביאור.

כדי להדגים זאת, נראה כיצד להחצין את הערכים של לְעַכֵּב ו מקס נסיונות לקובץ מאפיינים.

ראשית, בואו נגדיר את המאפיינים בקובץ שנקרא נסה שוב את הקונפיג.נכסים:

retry.maxAttrors = 2 retry.maxDelay = 100

לאחר מכן אנו מנחים את שלנו @תְצוּרָה בכיתה לטעינת קובץ זה:

// ... @PropertySource ("classpath: retryConfig.properties") מחלקה ציבורית AppConfig {...}

סוף כל סוף, אנו מסוגלים להזרים את הערכים של נסה שוב.מאקס נסיונות ו נסה שוב.מאקס דלה בשלנו @Retryable הַגדָרָה:

ממשק ציבורי @Service MyService {@Retryable (value = SQLException.class, maxAttemptExpression = "$ {retry.maxAttempt}", backoff = @Backoff (delayExpression = "$ {retry.maxDelay}")) ​​בטל retryServiceWithExternalizedConfiguration (String sql) SQLException; }

שים לב ש אנו משתמשים כעת maxAttrorsExpression ו עיכוב ביטוי במקום מקס נסיונות ו לְעַכֵּב.

5. נסה שוב את התבנית

5.1 נסה שוב פעולות

Spring Retry מספק נסה שוב פעולות ממשק המספק סט של לבצע() שיטות:

ממשק ציבורי RetryOperations {T לבצע (RetryCallback retryCallback) זורק חריג; ...}

ה נסה שוב את החזרה שהוא פרמטר של ה- לבצע() הוא ממשק המאפשר הכנסת לוגיקה עסקית שיש לנסות שוב לאחר כישלון:

ממשק ציבורי RetryCallback {T doWithRetry (הקשר RetryContext) זורק Throwable; }

5.2. נסה שוב את התבנית תְצוּרָה

ה נסה שוב את התבנית הוא יישום של נסה שוב פעולות. בואו להגדיר את a נסה שוב את התבנית שעועית אצלנו @תְצוּרָה מעמד:

@Configuration public class AppConfig {// ... @Bean public RetryTemplate retryTemplate () {RetryTemplate retryTemplate = New RetryTemplate (); FixedBackOffPolicy fixedBackOffPolicy = FixedBackOffPolicy חדש (); fixedBackOffPolicy.setBackOffPeriod (2000l); נסה שובTemplate.setBackOffPolicy (fixedBackOffPolicy); SimpleRetryPolicy retryPolicy = SimpleRetryPolicy חדש (); retryPolicy.setMaxAttempts (2); retryTemplate.setRetryPolicy (retryPolicy); החזר retryTemplate; }} 

ה נסה שוב מדיניות קובע מתי יש לנסות שוב פעולה.

א SimpleRetryPolicy משמש לניסיון חוזר מספר קבוע של פעמים. מצד שני, ה BackOffPolicy משמש לבקרת כיבוי בין ניסיונות חוזרים.

לבסוף, א FixedBackOffPolicy מושהה לפרק זמן קבוע לפני שממשיך.

5.3. משתמש ב נסה שוב את התבנית

כדי להפעיל קוד עם טיפול חוזר נוכל להתקשר ל- r etryTemplate.execute () שיטה :

retryTemplate.execute (RetryCallback חדש () {@Override public Void doWithRetry (RetryContext arg0) {myService.templateRetryService (); ...}});

במקום מעמד אנונימי נוכל להשתמש בביטוי למבדה באופן הבא:

retryTemplate.execute (arg0 -> {myService.templateRetryService (); return null;}); 

6. מאזינים

המאזינים מספקים שיחות חוזרות נוספות לאחר ניסיון חוזר. אנו יכולים להשתמש בהן לבעיות רוחביות שונות על פני ניסויים חוזרים שונים.

6.1. הוספת התקשרות חוזרות

השיחות החוזרות ניתנות בסעיף א נסה שוב את האזנה מִמְשָׁק:

מחלקה ציבורית DefaultListenerSupport מרחיב RetryListenerSupport {@Override public void close (RetryContext context, RetryCallback callback, Throwable throwable) {logger.info ("onClose); ... super.close (context, callback, throwable);} @Override public public void onError (הקשר RetryContext, החזרת RetryCallback, זורק לזריקה) {logger.info ("onError"); ... super.onError (הקשר, callback, throwable);} @ Override ציבור בוליאני פתוח (הקשר RetryContext, RetryCallback callback) {לוגר. מידע ("onOpen); ... להחזיר super.open (הקשר, התקשרות חוזרת); }}

ה לִפְתוֹחַ ו סגור שיחות חוזרות מגיעות לפני ואחרי כל ניסיון החזרה, בעוד onError חל על הפרט נסה שוב את החזרה שיחות.

6.2. רישום המאזין

לאחר מכן נרשום את המאזין שלנו (DefaultListenerSupport) שלנו נסה שוב את התבנית אפונה:

@Configuration class class AppConfig {... @Bean public RetryTemplate retryTemplate () {RetryTemplate retryTemplate = New RetryTemplate (); ... retryTemplate.registerListener (חדש DefaultListenerSupport ()); החזר retryTemplate; }}

7. בדיקת התוצאות

לסיום הדוגמה שלנו, בואו נוודא את התוצאות:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) מחלקה ציבורית SpringRetryIntegrationTest {@ MyService הפרטי MyService פרטי; @ פרטית אוטומטית RetryTemplate retryTemplate; @Test (צפוי = RuntimeException.class) חלל ציבורי givenTemplateRetryService_whenCallWithException_thenRetry () {retryTemplate.execute (arg0 -> {myService.templateRetryService (); return null;}); }}

כפי שאנו רואים ביומני הבדיקה, ה- נסה שוב את התבנית וה נסה שוב את האזנה הוגדרו כהלכה:

2020-01-09 20:04:10 [main] INFO obsDefaultListenerSupport - onOpen 2020-01-09 20:04:10 [main] INFO o.baeldung.springretry.MyServiceImpl - throw RuntimeException בתבנית השיטה RetryService () 2020-01 -09 20:04:10 [main] INFO obsDefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO o.baeldung.springretry.MyServiceImpl - throw RuntimeException בתבנית השיטה RetryService () 2020-01-09 20 : 04: 12 [ראשי] INFO obsDefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO obsDefaultListenerSupport - onClose

8. סיכום

במאמר זה ראינו כיצד להשתמש ב- Spring Retry באמצעות ביאורים, ה- נסה שוב את התבנית, ומאזינים להתקשרות חוזרת.

קוד המקור של הדוגמאות זמין ב- GitHub.