Hi everyone,
We all are aware that we sometimes need to add a connection and a read time-out attribute to a rest client to stop it from long wait for resources.
In spring boot, we can define a Bean to inject an object.
So, let’s jump into the code directly.
@Configuration public class ProjectConfiguration { @LoadBalanced @Bean public WebClient.Builder webClientLoadBalanced() { return WebClient.builder(); } @Primary @Bean(name = "WebClientWithTimeout") public WebClient.Builder webClient() { String connectionProviderName = "customConnectionProvider"; int maxConnections = 20; int acquireTimeout = 20; ConnectionProvider connectionProvider = ConnectionProvider.builder(connectionProviderName) .maxConnections(maxConnections) .pendingAcquireTimeout(Duration.ofSeconds(acquireTimeout)) .build(); HttpClient httpClient = HttpClient.create(connectionProvider) .tcpConfiguration(tcpClient -> tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) .doOnConnected(connection -> { connection.addHandlerLast(new ReadTimeoutHandler(5)); connection.addHandlerLast(new WriteTimeoutHandler(5)); })); return WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)); } }
In this example, 2 beans of Webclient has been declared. One is loadbalaced. Another one is the primary one – with @Primary annotation. The main webclient is the primary one and it has timeout attributes.
That’s it.
Feedback / comments are welcome.
Have a nice day ahead.
Leave a Reply