Útmutató a tavaszi újrapróbálkozáshoz

1. Áttekintés

A tavaszi újrapróbálkozás lehetővé teszi a sikertelen művelet automatikus újbóli meghívását. Ez akkor hasznos, ha a hibák átmenetiek lehetnek (például egy pillanatnyi hálózati hiba).

Ebben az oktatóanyagban megismerhetjük a Tavaszi újrapróbálkozás különböző módjait: kommentárok, RetryTemplateés visszahívások.

2. Maven-függőségek

Kezdjük azzal hozzáadva a tavasz-újrapróbálkozás függőség a mi pom.xml fájl:

 org.springframework.retry spring-retry 1.2.5.KÖZLEMÉNY 

A tavaszi AOP-t is hozzá kell adnunk a projektünkhöz:

 org.springframework tavaszi szempontok 5.2.8.FELHASZNÁLÁS 

Vessen egy pillantást a Maven Central oldalára a rugó-újrapróbálkozás és a rugó-aspektus függőségek legújabb verzióinak megtekintéséhez.

3. A tavaszi újrapróbálkozás engedélyezése

A Spring Retry engedélyezéséhez egy alkalmazásban hozzá kell adnunk a @EnableRetry annotáció a miénknek @ Konfiguráció osztály:

@Configuration @EnableRetry nyilvános osztály AppConfig {...}

4. A tavaszi újrapróbálkozás használata

4.1. @Megismételhető Helyreállítás nélkül

Az újrapróbálkozási funkció hozzáadásához a módszerekhez használhatjuk a @Megismételhető kommentár:

@Service nyilvános felület MyService {@Retryable (value = RuntimeException.class) void retryService (String sql); }

Ebben a példában az újrapróbálkozást megkísérlik, amikor a RuntimeException dobják.

Per @MegismételhetőAlapértelmezett viselkedése, az újrapróbálkozás akár háromszor is megtörténhet, egy másodperces késéssel az ismétlések között.

4.2. @Megismételhető és @Visszaszerez

Adjunk hozzá egy helyreállítási módszert a @Visszaszerez kommentár:

@Service nyilvános felület MyService {@Retryable (value = SQLException.class) void retryServiceWithRecovery (String sql) dob SQLException; @Recover void helyreállítás (SQLException e, String sql); }

Ebben a példában az újrapróbálkozást megkísérlik, amikor egy SQLEkivétel dobják.A @Visszaszerez az annotáció külön helyreállítási módszert határoz meg, amikor a @Megismételhető metódus egy meghatározott kivétellel meghiúsul.

Következésképpen, ha a retryServiceWithRecovery módszer folyamatosan dobja a SqlException 3 kísérlet után a visszaszerez() metódust fogjuk hívni.

A helyreállítási kezelőnek rendelkeznie kell az első típusú paraméterrel Dobható (opcionális) és ugyanaz a visszatérési típus.A következő argumentumok a sikertelen metódus argumentumlistájából kerülnek feltöltésre ugyanabban a sorrendben.

4.3. Testreszabás @ Újrapróbálható Viselkedés

Az újrapróbálkozás viselkedésének testreszabása érdekében használhatjuk a paramétereket maxKísérletek és hátrálj:

@Service nyilvános felület MyService {@Retryable (érték = SQLException.class, maxAtt próbálkozások = 2, backoff = @Backoff (késleltetés = 100)) void retryServiceWithCustomization (String sql) dobja az SQLException-t; }

A fenti példában legfeljebb 2 próbálkozás és 100 milliszekundum késés lehetséges.

4.4. A tavaszi tulajdonságok használata

A. Tulajdonságait is felhasználhatjuk @Megismételhető annotáció.

Ennek bemutatására meglátjuk, hogyan lehet a késleltetés és maxKísérletek tulajdonságfájlba.

Először definiáljuk a tulajdonságokat egy nevű fájlban retryConfig.tulajdonságait:

retry.maxAtt kísérletek = 2 retry.maxDelay = 100

Ezután utasítjuk a mi @ Konfiguráció osztály a fájl betöltéséhez:

// ... @PropertySource ("classpath: retryConfig.properties") public class AppConfig {...}

Végül, képesek vagyunk beinjekciózni a próbálkozzon újra.maxKísérletek és próbálkozzon újra.maxDelay miénkben @Megismételhető meghatározás:

@Service nyilvános felület MyService {@Retryable (érték = SQLException.class, maxAttumpsExpression = "$ {retry.maxAtt próbálkozás}", backoff = @Backoff (delayExpression = "$ {retry.maxDelay}")) ​​void retryServiceWithExternalizedCon SQLException; }

Kérjük, vegye figyelembe, hogy most használjuk maxAttumpsExpression és delayExpression ahelyett maxKísérletek és késleltetés.

5. RetryTemplate

5.1 RetryOperations

Tavaszi újrapróbálkozás RetryOperations interfész, amely egy sor végrehajtani () mód:

nyilvános felület RetryOperations {T végrehajt (RetryCallback retryCallback) dobja a Kivételt; ...}

A RetryCallback amely a végrehajtani () egy olyan felület, amely lehetővé teszi az üzleti logika beillesztését, amelyet meg kell próbálni a hiba után:

nyilvános felület RetryCallback {T doWithRetry (RetryContext context) dobja Throwable; }

5.2. RetryTemplate Konfiguráció

A RetryTemplate megvalósítása a RetryOperations. Konfiguráljuk a RetryTemplate bab a mi @ Konfiguráció osztály:

@Configuration public class AppConfig {// ... @Bean public RetryTemplate retryTemplate () {RetryTemplate retryTemplate = new RetryTemplate (); FixedBackOffPolicy fixedBackOffPolicy = új FixedBackOffPolicy (); fixedBackOffPolicy.setBackOffPeriod (2000l); retryTemplate.setBackOffPolicy (fixedBackOffPolicy); SimpleRetryPolicy retryPolicy = új SimpleRetryPolicy (); retryPolicy.setMaxAtt kísérletek (2); retryTemplate.setRetryPolicy (retryPolicy); return retryTemplate; }} 

A RetryPolicy meghatározza, hogy egy műveletet mikor kell újra megpróbálni.

A SimpleRetryPolicy rögzített számú alkalommal próbálkozik újra. Másrészt a BackOffPolicy az újrapróbálkozások közötti hátralépés szabályozására szolgál.

Végül a FixedBackOffPolicy meghatározott ideig szünetel, mielőtt folytatja.

5.3. Használni a RetryTemplate

A kód futtatásához újrapróbálkozással hívhatjuk az r-t etryTemplate.execute () módszer:

retryTemplate.execute (új RetryCallback () {@Override public Void doWithRetry (RetryContext arg0) {myService.templateRetryService (); ...}});

Névtelen osztály helyett használhatunk lambda kifejezést az alábbiak szerint:

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

6. Hallgatók

A hallgatók további visszahívásokat biztosítanak az újrapróbálkozások után. Ezeket felhasználhatjuk különböző átfogó problémákra a különböző próbálkozások során.

6.1. Visszahívások hozzáadása

A visszahívásokat a RetryListener felület:

public class DefaultListenerSupport kiterjeszti a RetryListenerSupport {@Orride public void close (RetryContext context, RetryCallback callback, Throwable dobható) {logger.info ("onClose); ... super.close (context, callback, dobható);} @Orride public void onError (RetryContext context, RetryCallback callback, Throwable dobható) {logger.info ("onError"); ... super.onError (context, callback, dobható);} @Orride public boolean open (RetryContext context, RetryCallback callback) {logger. info ("onOpen); ... visszatér super.open (kontextus, visszahívás); }}

A nyisd ki és Bezárás visszahívások az egész újrapróbálkozás előtt és után érkeznek, míg onError az egyénre vonatkozik RetryCallback hívások.

6.2. A Hallgató regisztrálása

Ezután regisztráljuk a hallgatónkat (DefaultListenerSupport) a miénknek RetryTemplate bab:

@Configuration public class AppConfig {... @Bean public RetryTemplate retryTemplate () {RetryTemplate retryTemplate = new RetryTemplate (); ... retryTemplate.registerListener (új DefaultListenerSupport ()); return retryTemplate; }}

7. Az eredmények tesztelése

Példánk lezárásaként ellenőrizzük az eredményeket:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (class = AppConfig.class, loader = AnnotationConfigContextLoader.class) public class SpringRetryIntegrationTest {@Autowired private MyService myService; @Autowired private RetryTemplate retryTemplate; @Test (várható = RuntimeException.class) public void givenTemplateRetryService_whenCallWithException_thenRetry () {retryTemplate.execute (arg0 -> {myService.templateRetryService (); return null;}); }}

Mint a tesztnaplókból láthatjuk, a RetryTemplate és a RetryListener megfelelően konfigurálták:

2020-01-09 20:04:10 [main] INFO obsDefaultListenerSupport - onOpen 2020-01-09 20:04:10 [main] INFO o.baeldung.springretry.MyServiceImpl - dobja a RuntimeException metódus sablonbanRetryService () 2020-01 -09 20:04:10 [main] INFO obsDefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO o.baeldung.springretry.MyServiceImpl - dobja a RuntimeException metódus sablonbanRetryService () 2020-01-09 20 : 04: 12 [main] INFO obsDefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO obsDefaultListenerSupport - onClose

8. Következtetés

Ebben a cikkben láthattuk, hogyan kell használni a Tavaszi újrapróbálkozást kommentárok, a RetryTemplate, és visszahívási hallgatók.

A példák forráskódja elérhető a GitHub oldalon.