@@ -17,6 +17,7 @@ package com.gooddata.oauth2.server
1717
1818import io.netty.channel.ChannelOption
1919import java.time.Duration
20+ import org.slf4j.LoggerFactory
2021import org.springframework.boot.context.properties.EnableConfigurationProperties
2122import org.springframework.context.annotation.Bean
2223import org.springframework.context.annotation.Configuration
@@ -37,9 +38,11 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser
3738import org.springframework.security.oauth2.core.user.OAuth2User
3839import org.springframework.web.client.RestTemplate
3940import org.springframework.web.reactive.function.client.WebClient
41+ import org.springframework.web.reactive.function.client.WebClientRequestException
4042import reactor.netty.http.client.HttpClient
4143import reactor.netty.resources.ConnectionProvider
4244import reactor.netty.resources.ConnectionProvider.DEFAULT_POOL_ACQUIRE_TIMEOUT
45+ import reactor.util.retry.Retry
4346
4447private const val DEFAULT_MAX_CONNECTIONS = 500
4548private const val CUSTOM_CONNECTION_PROVIDER_NAME = " gdc-connection-provider"
@@ -58,6 +61,16 @@ class ReactiveCommunicationClientsConfiguration(private val httpProperties: Http
5861 .option(ChannelOption .CONNECT_TIMEOUT_MILLIS , httpProperties.connectTimeoutMillis)
5962 return WebClient .builder()
6063 .clientConnector(ReactorClientHttpConnector (httpClient))
64+ .filter { request, next ->
65+ next.exchange(request)
66+ .retryWhen(
67+ Retry .backoff(MAX_RETRY_ATTEMPTS , Duration .ofSeconds(RETRY_BACKOFF_SECONDS ))
68+ .filter { throwable -> throwable is WebClientRequestException }
69+ .doBeforeRetry { retrySignal ->
70+ log.warn(" Retrying request after error: {}" , retrySignal.failure().message)
71+ }
72+ )
73+ }
6174 .build()
6275 }
6376
@@ -124,4 +137,10 @@ class ReactiveCommunicationClientsConfiguration(private val httpProperties: Http
124137 setWebClient(webClient)
125138 setBodyExtractor(SafeOAuth2AccessTokenResponseBodyExtractor ())
126139 }
140+
141+ companion object {
142+ private val log = LoggerFactory .getLogger(ReactiveCommunicationClientsConfiguration ::class .java)
143+ private const val MAX_RETRY_ATTEMPTS = 3L
144+ private const val RETRY_BACKOFF_SECONDS = 1L
145+ }
127146}
0 commit comments