A tal proposito ci viene in aiuto Spring Retry e mostriamo di seguito un semplicissimo controller rest implementato utilizzando Spring, che non fa altro che richiamare piu' volte lo stesso metodo di fronte al generarsi di un'eccezione.
Controller:
Codice: Seleziona tutto
@RestController
public class Controller {
@RequestMapping(value = "/", method = RequestMethod.GET)
@Retryable(value = {NumberFormatException.class, NullPointerException.class}, maxAttempts = 5)
public String myApp() {
System.out.println("My App is calling...");
Integer.parseInt("");
/*
* String str = null;
* str.length();
*/
return "SUCCESS";
}
@Recover
public String recover(NumberFormatException ex) {
System.out.println("Recover method: NumberFormatException");
return "Recover method: NumberFormatException";
}
@Recover
public String recover(NullPointerException ex) {
System.out.println("Recover method: NullPointerException");
return "Recover method: NullPointerException";
}
}
Codice: Seleziona tutto
@SpringBootApplication
@EnableRetry
public class AppRetry {
public static void main(String[] args) {
SpringApplication.run(AppRetry.class, args);
}
}
- nel Main inseriamo l'annotazione @EnableRetry per abilitare la funzione di Retry nella nostra applicazione
- la classe Controller sara' formata da un metodo annotato come @Retryable in cui inseriamo le eccezioni che vogliamo gestire per effettuare il Retry e il numero di volte che vogliamo effettuarlo "maxAttempts"
- la classe Controller sara' formata da altri due metodi annotati con @Recover che servono per gestire per ogni eccezione, l'operazione finale da effettuare in caso si arriva al numero massimo di tentativi
- le righe di codice "Integer.parseInt("");" e "str.length();" ci servono all'occorrenza per generare una o l'altra eccezione
La dipendenza da aggiungere nel pom e' la seguente:
Codice: Seleziona tutto
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
Codice: Seleziona tutto
<version>1.2.4.RELEASE</version>