Spring / Spring Retry Interview Questions
How can you use Spring Retry with Spring WebClient or RestTemplate?
Spring Retry can wrap calls made through RestTemplate or WebClient to handle transient HTTP failures automatically. The approach differs slightly between the two due to their synchronous vs reactive nature.
With RestTemplate (synchronous) — using @Retryable:
@Service public class OrderClient { @Retryable( retryFor = { HttpServerErrorException.class, ResourceAccessException.class }, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2) ) public OrderDto getOrder(Long id) { return restTemplate.getForObject("/orders/" + id, OrderDto.class); } @Recover public OrderDto recover(HttpServerErrorException ex, Long id) { return OrderDto.fallback(id); } }
With WebClient (reactive) — using reactor-retry or Mono.retryWhen:
webClient.get() .uri("/orders/" + id) .retrieve() .bodyToMono(OrderDto.class) .retryWhen(Retry.backoff(3, Duration.ofMillis(500)) .filter(ex -> ex instanceof WebClientResponseException.ServiceUnavailable));
Note: @Retryable does not integrate naturally with reactive streams because it is designed for synchronous, blocking method calls. For reactive code, use Project Reactor's native Mono.retryWhen or Flux.retryWhen with reactor.util.retry.Retry.
More Related questions...