Sprievodca jarným pokusom

1. Prehľad

Spring Retry poskytuje schopnosť automaticky znovu vyvolať zlyhanú operáciu. To je užitočné, keď môžu byť chyby prechodné (napríklad okamžitá porucha siete).

V tomto tutoriáli sa dozvieme rôzne spôsoby použitia Spring Retry: anotácie, RetryTemplatea spätné volania.

2. Maven závislosti

Začnime tým pridanie jarný pokus závislosť do našej pom.xml spis:

 org.springframework.retry spring-retry 1.2.5.RELEASE 

Do nášho projektu tiež musíme pridať jarný AOP:

 aspekty pružiny org.springframework 5.2.8.RELEASE 

Pozrite sa na Maven Central, kde nájdete najnovšie verzie závislostí jarných pokusov a jarných aspektov.

3. Povolenie pokusu o jar

Ak chcete v aplikácii povoliť Spring Retry, musíme pridať @EnableRetry anotácia k nášmu @ Konfigurácia trieda:

@Configuration @EnableRetry verejná trieda AppConfig {...}

4. Používanie Spring Retry

4.1. @ Opakovateľné Bez zotavenia

Ak chceme k metódam pridať funkciu opakovania, môžeme použiť @ Opakovateľné anotácia:

@ Verejné rozhranie služby MyService {@Retryable (hodnota = RuntimeException.class) void retryService (reťazec sql); }

V tomto príklade sa o pokus pokúsi, keď a RuntimeException je hodená.

Za @ OpakovateľnéPredvolené správanie, pokus sa môže opakovať až trikrát, medzi pokusmi je oneskorenie jednej sekundy.

4.2. @ Opakovateľné a @ Obnoviť

Teraz pridajme metódu obnovenia pomocou @ Obnoviť anotácia:

@ Verejné rozhranie služby MyService {@Retryable (hodnota = SQLException.class) void retryServiceWithRecovery (reťazec sql) hodí SQLException; @Recover void recover (SQLException e, String sql); }

V tomto príklade sa o pokus pokúsi, keď SQLException je hodená.The @ Obnoviť anotácia definuje samostatnú metódu obnovy, keď a @ Opakovateľné metóda zlyhá so zadanou výnimkou.

Ak teda retryServiceWithRecovery metóda stále vyhadzuje a SqlException po 3 pokusoch sa zotaviť sa () metóda sa bude volať.

Obslužná rutina obnovy by mala mať prvý parameter typu Hoditeľné (voliteľné) a rovnaký návratový typ.Nasledujúce argumenty sú vyplnené zo zoznamu argumentov neúspešnej metódy v rovnakom poradí.

4.3. Prispôsobenie @ Opakovateľné Správanie

Ak chcete prispôsobiť správanie pokusu, môžeme použiť parametre maxAttempts a ustúpiť:

@ Verejné rozhranie služby MyService {@Retryable (hodnota = SQLException.class, maxAttempts = 2, backoff = @Backoff (oneskorenie = 100)) void retryServiceWithCustomization (reťazec sql) hodí SQLException; }

Vo vyššie uvedenom príklade sa vyskytnú až 2 pokusy a oneskorenie 100 milisekúnd.

4.4. Pomocou vlastností pružiny

Môžeme tiež použiť vlastnosti v @ Opakovateľné anotácia.

Na demonštráciu toho uvidíme, ako externalizovať hodnoty meškanie a maxAttempts do súboru vlastností.

Najskôr definujme vlastnosti v súbore s názvom retryConfig.vlastnosti:

retry.maxAttempts = 2 retry.maxDelay = 100

Potom poučíme našich @ Konfigurácia triedy na načítanie tohto súboru:

// ... @PropertySource ("classpath: retryConfig.properties") verejná trieda AppConfig {...}

Nakoniec sme schopní vložiť hodnoty retry.maxAttempts a retry.maxDelay v našom @ Opakovateľné definícia:

@ Verejné rozhranie služby MyService {@Retryable (value = SQLException.class, maxAttemptsExpression = "$ {retry.maxAttempts}", backoff = @Backoff (delayExpression = "$ {retry.maxDelay}")) ​​void retryServiceWithExternalizedConfigurations (reťazec sql) SQLException; }

Vezmite prosím na vedomie, že teraz používame maxAttemptsExpression a delayExpression namiesto maxAttempts a meškanie.

5. RetryTemplate

5.1 RetryOperations

Spring Retry poskytuje RetryOperations rozhranie, ktoré dodáva sadu vykonať () metódy:

verejné rozhranie RetryOperations {T execute (RetryCallback retryCallback) vyvolá výnimku; ...}

The RetryCallback ktorý je parametrom vykonať () je rozhranie, ktoré umožňuje vloženie obchodnej logiky, ktorú je potrebné pri zlyhaní zopakovať:

verejné rozhranie RetryCallback {T doWithRetry (kontext RetryContext) hodí Throwable; }

5.2. RetryTemplate Konfigurácia

The RetryTemplate je implementácia RetryOperations. Nakonfigurujme a RetryTemplate fazuľa v našom @ Konfigurácia trieda:

@Configuration public class AppConfig {// ... @Bean public RetryTemplate retryTemplate () {RetryTemplate retryTemplate = nový RetryTemplate (); FixedBackOffPolicy fixedBackOffPolicy = nový FixedBackOffPolicy (); fixedBackOffPolicy.setBackOffPeriod (2 000 l); retryTemplate.setBackOffPolicy (fixedBackOffPolicy); SimpleRetryPolicy retryPolicy = nový SimpleRetryPolicy (); retryPolicy.setMaxAttempts (2); retryTemplate.setRetryPolicy (retryPolicy); vrátiť retryTemplate; }} 

The RetryPolicy určuje, kedy sa má operácia opakovať.

A SimpleRetryPolicy sa používa na opakovaný stanovený počet opakovaní. Na druhej strane BackOffPolicy sa používa na riadenie spätného chodu medzi pokusmi o opakovanie.

Nakoniec a FixedBackOffPolicy pred pokračovaním pozastaví na dobu určitú.

5.3. Pomocou RetryTemplate

Na spustenie kódu s opakovaním môžeme zavolať r etryTemplate.execute () metóda:

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

Namiesto anonymnej triedy môžeme použiť výraz lambda nasledovne:

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

6. Poslucháči

Pri ďalšom pokuse poslucháči poskytnú ďalšie spätné volania. Môžeme ich použiť pri rôznych prierezových problémoch naprieč rôznymi pokusmi.

6.1. Pridávanie spätných volaní

Spätné volania sú poskytované v a RetryListener rozhranie:

public class DefaultListenerSupport extends RetryListenerSupport {@Override public void close (RetryContext context, RetryCallback callback, Throwable throwable) {logger.info ("onClose); ... super.close (context, callback, throwable);} @Override public void onError (Kontext RetryContext, spätné volanie RetryCallback, hádzateľné vrhateľné) {logger.info ("onError"); ... super.onError (kontext, spätné volanie, hádzateľné);} @Override public boolean open (kontext RetryContext, spätné volanie RetryCallback) {logger. info ("onOpen); ... návrat super.open (kontext, spätné volanie); }}

The otvorené a Zavrieť spätné volania prichádzajú pred a po celom opakovaní onError platí pre jednotlivca RetryCallback hovory.

6.2. Registrácia poslucháča

Ďalej zaregistrujeme nášho poslucháča (DefaultListenerSupport) k nášmu RetryTemplate fazuľa:

@Configuration public class AppConfig {... @Bean public RetryTemplate retryTemplate () {RetryTemplate retryTemplate = nový RetryTemplate (); ... retryTemplate.registerListener (nový DefaultListenerSupport ()); vrátiť retryTemplate; }}

7. Testovanie výsledkov

Na záver nášho príkladu, poďme overiť výsledky:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = AppConfig.class, loader = AnnotationConfigContextLoader.class) verejná trieda SpringRetryIntegrationTest {@Autowired private MyService myService; @Autowired private RetryTemplate retryTemplate; @Test (očakáva sa = RuntimeException.class) public void givenTemplateRetryService_whenCallWithException_thenRetry () {retryTemplate.execute (arg0 -> {myService.templateRetryService (); return null;}); }}

Ako vidíme z testovacích protokolov, RetryTemplate a RetryListener boli správne nakonfigurované:

2020-01-09 20:04:10 [main] INFO obsDefaultListenerSupport - onOpen 2020-01-09 20:04:10 [main] INFO o.baeldung.springretry.MyServiceImpl - hod RuntimeException v metóde templateRetryService () 2020-01 -09 20:04:10 [main] INFO obsDefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO o.baeldung.springretry.MyServiceImpl - hod RuntimeException v metóde templateRetryService () 2020-01-09 20 : 04: 12 [main] INFO obsDefaultListenerSupport - onError 2020-01-09 20:04:12 [main] INFO obsDefaultListenerSupport - onClose

8. Záver

V tomto článku sme videli, ako používať Spring Retry pomocou anotácií, RetryTemplate, a poslucháči spätných volaní.

Zdrojový kód príkladov je k dispozícii na serveri GitHub.