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: Namiesto anonymnej triedy môžeme použiť výraz lambda nasledovne: 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. Spätné volania sú poskytované v a RetryListener rozhranie: The otvorené a Zavrieť spätné volania prichádzajú pred a po celom opakovaní onError platí pre jednotlivca RetryCallback hovory. Ďalej zaregistrujeme nášho poslucháča (DefaultListenerSupport) k nášmu RetryTemplate fazuľa: Na záver nášho príkladu, poďme overiť výsledky: Ako vidíme z testovacích protokolov, RetryTemplate a RetryListener boli správne nakonfigurované: 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.retryTemplate.execute (new RetryCallback () {@Override public Void doWithRetry (RetryContext arg0) {myService.templateRetryService (); ...}});
retryTemplate.execute (arg0 -> {myService.templateRetryService (); return null;});
6. Poslucháči
6.1. Pridávanie spätných volaní
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); }}
6.2. Registrácia poslucháča
@Configuration public class AppConfig {... @Bean public RetryTemplate retryTemplate () {RetryTemplate retryTemplate = nový RetryTemplate (); ... retryTemplate.registerListener (nový DefaultListenerSupport ()); vrátiť retryTemplate; }}
7. Testovanie výsledkov
@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;}); }}
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