স্প্রিং বুট ক্লায়েন্টে Connection Pooling এবং Timeout কনফিগারেশন কার্যকর করতে RestTemplate বা WebClient ব্যবহার করা যেতে পারে। নিচে ধাপে ধাপে এই কনফিগারেশনগুলো দেখানো হলো।
১. Connection Pooling কনফিগারেশন
১.১ RestTemplate এর জন্য Connection Pooling
HttpClient বা HttpComponentsClientHttpRequestFactory ব্যবহার করে Connection Pooling সেটআপ করা যায়।
ডিপেন্ডেন্সি যোগ করা:
pom.xml এ Apache HttpClient ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.4</version>
</dependency>
কনফিগারেশন:
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.util.TimeValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
// Create connection manager
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(50); // Max total connections
connectionManager.setDefaultMaxPerRoute(20); // Max connections per route
connectionManager.setValidateAfterInactivity(TimeValue.ofSeconds(10));
// Create HttpClient with connection manager
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
// Create RestTemplate with custom request factory
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(requestFactory);
}
}
১.২ WebClient এর জন্য Connection Pooling
Reactor Netty ব্যবহার করে WebClient এ Connection Pooling কনফিগার করা যায়।
ডিপেন্ডেন্সি যোগ করা:
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
</dependency>
কনফিগারেশন:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
// Create connection pool
ConnectionProvider provider = ConnectionProvider.builder("custom")
.maxConnections(50)
.pendingAcquireMaxCount(100)
.build();
HttpClient httpClient = HttpClient.create(provider);
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
২. Timeout কনফিগারেশন
২.১ RestTemplate এর জন্য Timeout
HttpComponentsClientHttpRequestFactory ব্যবহার করে Timeout কনফিগার করা যায়।
উদাহরণ:
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.util.Timeout;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(
org.apache.hc.client5.http.config.RequestConfig.custom()
.setConnectTimeout(Timeout.ofSeconds(5)) // Connection timeout
.setResponseTimeout(Timeout.ofSeconds(10)) // Read timeout
.build()
)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(requestFactory);
}
}
২.২ WebClient এর জন্য Timeout
HttpClient ব্যবহার করে WebClient-এ Timeout কনফিগার করা যায়।
উদাহরণ:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
HttpClient httpClient = HttpClient.create()
.responseTimeout(java.time.Duration.ofSeconds(10)) // Response timeout
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); // Connection timeout
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
৩. Connection Pooling এবং Timeout একত্রে ব্যবহার
RestTemplate উদাহরণ:
@Bean
public RestTemplate restTemplate() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(50);
connectionManager.setDefaultMaxPerRoute(20);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(
org.apache.hc.client5.http.config.RequestConfig.custom()
.setConnectTimeout(Timeout.ofSeconds(5))
.setResponseTimeout(Timeout.ofSeconds(10))
.build()
)
.build();
return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));
}
WebClient উদাহরণ:
@Bean
public WebClient webClient() {
ConnectionProvider provider = ConnectionProvider.builder("custom")
.maxConnections(50)
.pendingAcquireMaxCount(100)
.build();
HttpClient httpClient = HttpClient.create(provider)
.responseTimeout(java.time.Duration.ofSeconds(10))
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
সংক্ষেপে:
- Connection Pooling:
- RestTemplate:
PoolingHttpClientConnectionManagerব্যবহার। - WebClient:
ConnectionProviderব্যবহার।
- RestTemplate:
- Timeout কনফিগারেশন:
- Connection এবং Read Timeout নির্ধারণ।
- বেস্ট প্র্যাকটিস:
- উচ্চ কনকারেন্সি হ্যান্ডল করার জন্য Connection Pooling অপরিহার্য।
- Slow API কল হ্যান্ডল করার জন্য যথাযথ Timeout ব্যবহার করুন।
এই পদ্ধতিগুলো ব্যবহার করে আপনি স্প্রিং বুট ক্লায়েন্টে Connection Pooling এবং Timeout সঠিকভাবে কনফিগার করতে পারবেন।
Read more