Custom HTTP Clients তৈরি

Java Technologies - অ্যাপাচি এইচটিটিপি ক্লায়েন্ট (Apache HTTP Client)
183
183

Apache HTTP Client ব্যবহার করে Custom HTTP Clients তৈরি করা হয় যখন আপনাকে কিছু বিশেষ কনফিগারেশন, যেমন custom timeouts, connection management, proxies, অথবা custom headers প্রয়োজন হয়। Apache HTTP Client এর মাধ্যমে HttpClient এবং HttpRequestConfig কনফিগারেশন ব্যবহার করে আপনি নিজের প্রয়োজন অনুসারে কাস্টম HTTP ক্লায়েন্ট তৈরি করতে পারেন।

কাস্টম HTTP ক্লায়েন্ট তৈরি করার জন্য HttpClientBuilder ব্যবহার করা হয়, যা আপনাকে ক্লায়েন্টের কনফিগারেশন নির্ধারণ করতে সহায়ক হয়। আপনি connection timeout, socket timeout, max connections এবং আরও অনেক কিছু কনফিগার করতে পারেন।

Custom HTTP Client তৈরি করার পদ্ধতি:

  1. Connection and Socket Timeouts সেট করা:
    • setConnectionTimeToLive() এবং setSocketTimeout() ব্যবহার করে আপনি সংযোগ এবং সোকেট টাইমআউট নির্ধারণ করতে পারেন।
  2. Max Connections এবং Connection Pooling:
    • PoolingHttpClientConnectionManager ব্যবহার করে আপনি HTTP ক্লায়েন্টের জন্য connection pooling এবং max connections কনফিগার করতে পারেন।
  3. Proxy Configuration:
    • যদি আপনার অ্যাপ্লিকেশনটি proxy সার্ভারের মাধ্যমে কাজ করে, তবে setProxy() এবং setProxyCredentials() ব্যবহার করে এটি কনফিগার করা যাবে।
  4. Custom Headers বা Authentication:
    • setDefaultHeaders() ব্যবহার করে আপনি সাধারণভাবে সকল request-এ custom headers যোগ করতে পারেন।

কোড উদাহরণ:

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.HttpHost;
import org.apache.http.HttpHeaders;
import org.apache.http.util.EntityUtils;

import java.net.URI;

public class CustomHttpClientExample {

    public static void main(String[] args) {
        
        // Custom Configuration
        int connectionTimeout = 5000; // 5 seconds
        int socketTimeout = 10000; // 10 seconds
        int maxConnections = 100;
        
        // Connection Pooling Setup
        PoolingHttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager();
        poolingConnManager.setMaxTotal(maxConnections); // Set max connections
        poolingConnManager.setDefaultMaxPerRoute(20); // Set max connections per route
        
        // RequestConfig Setup
        RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(connectionTimeout) // Connection timeout
            .setSocketTimeout(socketTimeout) // Socket timeout
            .build();

        // HttpClientBuilder Setup with Pooling and Timeouts
        CloseableHttpClient httpClient = HttpClients.custom()
            .setDefaultRequestConfig(requestConfig) // Apply RequestConfig
            .setConnectionManager(poolingConnManager) // Apply connection manager
            .addInterceptorFirst((request, context) -> {
                // Add Custom Header to each request
                request.addHeader(HttpHeaders.USER_AGENT, "CustomHttpClient");
            })
            .build();
        
        // Send a GET request
        String url = "https://jsonplaceholder.typicode.com/posts";
        try {
            HttpGet httpGet = new HttpGet(URI.create(url));
            
            // Custom Authentication or other Headers
            httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer <your_token_here>");

            // Send the request and receive the response
            HttpResponse response = httpClient.execute(httpGet);
            
            // Handle Response
            int statusCode = response.getStatusLine().getStatusCode();
            System.out.println("Response Code: " + statusCode);

            HttpEntity entity = response.getEntity();
            if (entity != null) {
                String responseBody = EntityUtils.toString(entity);
                System.out.println("Response Body: " + responseBody);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. Connection Pooling:
    • PoolingHttpClientConnectionManager ব্যবহার করে maxTotal এবং maxPerRoute সেট করা হয়, যা HTTP ক্লায়েন্টের জন্য কনেকশন পুল ম্যানেজমেন্ট নির্ধারণ করে।
    • maxConnections এবং defaultMaxPerRoute সেট করার মাধ্যমে একাধিক HTTP connection একযোগে ব্যবহৃত হয়।
  2. RequestConfig:
    • RequestConfig.custom() এর মাধ্যমে connectTimeout এবং socketTimeout নির্ধারণ করা হয়।
    • setConnectTimeout(connectionTimeout): ক্লায়েন্টের জন্য সর্বোচ্চ সময় যা অপেক্ষা করা হবে নতুন কনেকশন স্থাপনের জন্য।
    • setSocketTimeout(socketTimeout): সার্ভার থেকে response পাওয়ার জন্য সর্বোচ্চ সময়।
  3. Custom Headers:
    • addInterceptorFirst() ব্যবহার করে আপনি প্রতিটি request-এ custom headers (যেমন User-Agent) যোগ করতে পারেন।
  4. Proxy Configuration (Optional):
    • যদি আপনার অ্যাপ্লিকেশনটি একটি proxy সার্ভারের মাধ্যমে HTTP request পাঠায়, তবে setProxy() এবং setProxyCredentials() ব্যবহার করে proxy সেটিংস কনফিগার করতে পারেন।
  5. Authentication:
    • Bearer token authentication সহ custom headers সেট করা হয়েছে, যা HTTP request-এর Authorization header-এ Bearer পাঠানো হয়।

সারাংশ:

Custom HTTP Client তৈরি করার মাধ্যমে আপনি Apache HttpClient কে আপনার প্রয়োজন অনুসারে কনফিগার করতে পারেন। আপনি connection pooling, timeouts, custom headers, authentication এবং proxy settings কাস্টমাইজ করতে পারবেন। এর ফলে, আপনি আপনার HTTP ক্লায়েন্টের পারফরম্যান্স এবং নিরাপত্তা উন্নত করতে পারবেন।

common.content_added_by

Custom HttpClient কনফিগারেশন

144
144

অ্যাপাচি HTTP ক্লায়েন্টে কাস্টম HttpClient কনফিগারেশন তৈরি করার মাধ্যমে আপনি আপনার HTTP রিকোয়েস্ট এবং রেসপন্সের নিয়ন্ত্রণ বাড়াতে পারেন। বিভিন্ন ধরনের কনফিগারেশন যেমন টাইমআউট, প্রোক্সি, অটেন্টিকেশন, রিট্রাই হ্যান্ডলার, কনেকশন পুলিং ইত্যাদি কাস্টমাইজ করা যায়। এটি একটি নমনীয় প্রক্রিয়া যা বিভিন্ন ধরনের নেটওয়ার্ক চাহিদা পূরণের জন্য ব্যবহার করা যেতে পারে।

Custom HttpClient কনফিগারেশনের উদাহরণ:

এখানে কিছু সাধারণ কনফিগারেশন বিকল্প প্রদর্শিত হয়েছে, যেমন টাইমআউট, প্রোক্সি, কনেকশন পুলিং, এবং রিট্রাই হ্যান্ডলার কাস্টমাইজেশন।

Custom HttpClient কনফিগারেশন উদাহরণ:

import org.apache.http.HttpHost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.HttpResponse;
import org.apache.http.impl.client.HttpClientBuilder;

public class CustomHttpClientExample {

    public static void main(String[] args) {
        try {
            // RequestConfig তৈরি করা (কানেকশন টাইমআউট, সোকেট টাইমআউট)
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(5000)  // কানেকশন টাইমআউট
                    .setSocketTimeout(5000)   // সোকেট টাইমআউট
                    .build();

            // PoolingHttpClientConnectionManager তৈরি করা (কনেকশন পুলিং)
            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
            connectionManager.setMaxTotal(200);   // সর্বোচ্চ কানেকশন সংখ্যা
            connectionManager.setDefaultMaxPerRoute(20); // প্রতি রুটে সর্বোচ্চ কানেকশন সংখ্যা

            // প্রোক্সি কনফিগারেশন (যদি প্রয়োজন হয়)
            HttpHost proxy = new HttpHost("proxy.example.com", 8080);
            requestConfig = RequestConfig.custom()
                    .setProxy(proxy)
                    .setConnectTimeout(5000)
                    .setSocketTimeout(5000)
                    .build();

            // HttpClient তৈরি এবং কাস্টম কনফিগারেশন সেট করা
            CloseableHttpClient httpClient = HttpClients.custom()
                    .setDefaultRequestConfig(requestConfig)  // কনফিগারেশন যোগ করা
                    .setConnectionManager(connectionManager) // কানেকশন ম্যানেজার
                    .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)) // রিট্রাই হ্যান্ডলার
                    .build();

            // HTTP GET রিকোয়েস্ট তৈরি
            HttpGet httpGet = new HttpGet("http://example.com");
            HttpResponse response = httpClient.execute(httpGet);

            // রেসপন্স স্ট্যাটাস দেখানো
            System.out.println("Response Status: " + response.getStatusLine().getStatusCode());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

বিভিন্ন কাস্টম কনফিগারেশন:

  1. RequestConfig:
    • setConnectTimeout(): কানেকশন তৈরি করতে কত সময় নেওয়া হবে (মিলিসেকেন্ডে)।
    • setSocketTimeout(): রিড টাইমআউট সেট করা, অর্থাৎ সার্ভার থেকে রেসপন্স পেতে কত সময় নেওয়া যাবে।
    • setProxy(): যদি প্রোক্সি ব্যবহারের প্রয়োজন হয় তবে প্রোক্সি হোস্ট এবং পোর্ট এখানে কনফিগার করা হয়।
  2. PoolingHttpClientConnectionManager:
    • setMaxTotal(): সর্বোচ্চ কনেকশন সংখ্যা যা HTTP ক্লায়েন্ট ব্যবহার করতে পারবে।
    • setDefaultMaxPerRoute(): একযোগভাবে প্রতিটি রুটের জন্য সর্বোচ্চ কনেকশন সংখ্যা নির্ধারণ করে।
  3. DefaultHttpRequestRetryHandler:
    • এটি HTTP রিকোয়েস্টের জন্য রিট্রাই পলিসি কনফিগার করতে ব্যবহৃত হয়। এখানে ৩টি রিট্রাই চেষ্টার অনুমতি দেয় এবং পুনরায় চেষ্টা করতে সক্ষম।
  4. HttpClientBuilder:
    • setDefaultRequestConfig(): এখানে কনফিগারেশন সেট করা হয়, যা সমস্ত রিকোয়েস্টের জন্য প্রযোজ্য হবে।
    • setConnectionManager(): কানেকশন ম্যানেজার সেট করা হয় যা পুলিংয়ের মাধ্যমে একাধিক কানেকশন পরিচালনা করে।

বিস্তারিত কনফিগারেশন উদাহরণ:

যদি আপনি অতিরিক্ত কিছু কাস্টম সেটিংস যেমন SSL কনফিগারেশন, কাস্টম হেডার অথবা অটেন্টিকেশন অন্তর্ভুক্ত করতে চান, তাহলে তা নিম্নলিখিতভাবে করা যায়:

import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.HttpResponse;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.client.BasicCredentialsProvider;

public class CustomHttpClientWithAuth {

    public static void main(String[] args) {
        try {
            // Basic Authentication প্রোভাইডার তৈরি
            BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(
                    new org.apache.http.auth.AuthScope("example.com", 80),
                    new UsernamePasswordCredentials("user", "password"));

            // HttpClient তৈরি এবং Basic Authentication কনফিগার করা
            CloseableHttpClient httpClient = HttpClients.custom()
                    .setDefaultCredentialsProvider(credentialsProvider) // অটেন্টিকেশন প্রদানকারী
                    .build();

            // HTTP GET রিকোয়েস্ট তৈরি
            HttpGet httpGet = new HttpGet("http://example.com");
            HttpResponse response = httpClient.execute(httpGet);

            // রেসপন্স স্ট্যাটাস দেখানো
            System.out.println("Response Status: " + response.getStatusLine().getStatusCode());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

কাস্টম HttpClient কনফিগারেশনের সুবিধা:

  • টাইট সিকিউরিটি কনফিগারেশন: SSL, অটেন্টিকেশন, এবং এনক্রিপশন স্কিম কাস্টমাইজ করা যায়।
  • নেটওয়ার্ক পরিচালনা: কনেকশন পুলিং, প্রোক্সি কনফিগারেশন, এবং টাইমআউট সেট করে ট্রাফিককে আরও দক্ষভাবে পরিচালনা করা সম্ভব।
  • রিট্রাই মেকানিজম: নির্দিষ্ট কনফিগারেশন সেটিংসের মাধ্যমে রিকোয়েস্ট রিট্রাই হ্যান্ডলার কাস্টমাইজ করা যায়, যা নেটওয়ার্কের সমস্যাগুলোর মোকাবিলা করতে সহায়ক।

সারাংশ:

কাস্টম HttpClient কনফিগারেশন তৈরি করে, আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের জন্য একটি শক্তিশালী এবং নিরাপদ পরিবেশ তৈরি করতে পারেন। টাইমআউট, প্রোক্সি, কানেকশন পুলিং, অটেন্টিকেশন এবং রিট্রাই পলিসির মতো বিভিন্ন সেটিংস কাস্টমাইজ করা সম্ভব। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনটি আরও নিয়ন্ত্রণযোগ্য এবং নিরাপদ করতে পারেন।

common.content_added_by

Custom Request/Response Interceptors

191
191

অ্যাপাচি HTTP ক্লায়েন্ট (Apache HTTP Client)Custom Request/Response Interceptors ব্যবহৃত হয় রিকুয়েস্ট এবং রেসপন্স প্রক্রিয়ার মধ্যে কাস্টম লজিক প্রয়োগ করতে। ইন্টারসেপ্টরগুলি ক্লায়েন্টের রিকুয়েস্ট এবং রেসপন্স প্রক্রিয়াকে কাস্টমাইজ করতে এবং অতিরিক্ত ফিচার যেমন লগিং, কাস্টম হেডার অ্যাড করা, সিকিউরিটি চেক বা প্রোফাইলিং সম্পাদন করতে ব্যবহৃত হয়।

Request Interceptor এবং Response Interceptor:

  • Request Interceptor: এটি একটি কাস্টম লজিক যা HTTP রিকুয়েস্ট প্রেরণের আগে এক্সিকিউট হয়। আপনি এটি ব্যবহার করতে পারেন, যেমন হেডার যোগ করা, কুকি সেট করা, বা রিকুয়েস্টের কন্টেন্ট পরিবর্তন করা।
  • Response Interceptor: এটি রেসপন্স গ্রহণের পরে এক্সিকিউট হয় এবং রেসপন্সের কন্টেন্ট বা স্ট্যাটাস কোড পর্যালোচনা বা পরিবর্তন করতে ব্যবহৃত হয়।

উদাহরণ: Custom Request এবং Response Interceptors তৈরি করা

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.RequestConfig;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpRequestBase;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.HttpRequest;
import org.apache.http.HttpEntityEnclosingRequestBase;
import org.apache.http.impl.HttpClientBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.HttpResponseException;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.impl.client.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;
import java.io.IOException;

public class CustomInterceptorExample {
    public static void main(String[] args) {
        try {
            // Request Interceptor তৈরি করা (রিকুয়েস্টে কাস্টম হেডার যোগ করা)
            HttpRequestInterceptor requestInterceptor = (request, context) -> {
                request.addHeader("X-Custom-Header", "CustomHeaderValue");
                System.out.println("Request Interceptor: Added custom header.");
            };

            // Response Interceptor তৈরি করা (রেসপন্সের স্ট্যাটাস কোড পর্যালোচনা)
            HttpResponseInterceptor responseInterceptor = (response, context) -> {
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == 404) {
                    System.out.println("Response Interceptor: Resource not found (404).");
                }
            };

            // RequestConfig কনফিগারেশন
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(5000) // কানেকশন টাইমআউট
                    .setSocketTimeout(5000)  // সোকেট টাইমআউট
                    .build();

            // HttpClient কনফিগারেশন (ইন্টারসেপ্টর সহ)
            CloseableHttpClient httpClient = HttpClients.custom()
                    .addInterceptorFirst(requestInterceptor)  // Request Interceptor যোগ করা
                    .addInterceptorLast(responseInterceptor)   // Response Interceptor যোগ করা
                    .setDefaultRequestConfig(requestConfig)    // RequestConfig কনফিগারেশন সেট করা
                    .build();

            // HTTP GET রিকুয়েস্ট তৈরি করা
            HttpGet request = new HttpGet("http://example.com");

            // রিকুয়েস্ট পাঠানো এবং রেসপন্স গ্রহণ
            CloseableHttpResponse response = httpClient.execute(request);
            System.out.println("Response Status: " + response.getStatusLine().getStatusCode());

            // রেসপন্স কন্টেন্ট
            String responseContent = EntityUtils.toString(response.getEntity());
            System.out.println("Response Content: " + responseContent);

            response.close();
            httpClient.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

উদাহরণের ব্যাখ্যা:

  1. Request Interceptor: এই ইন্টারসেপ্টরটি HTTP রিকুয়েস্ট পাঠানোর আগে addHeader() মেথড ব্যবহার করে একটি কাস্টম হেডার (X-Custom-Header) যোগ করে। এটি ইন্টারসেপ্টরের ভিতরে যেকোনো পরিবর্তন বা কার্যকলাপ সম্পাদন করতে সক্ষম করে।
  2. Response Interceptor: এই ইন্টারসেপ্টরটি HTTP রেসপন্স গ্রহণের পর, রেসপন্সের স্ট্যাটাস কোড চেক করে। এখানে, যদি স্ট্যাটাস কোড 404 হয় (যেমন রিসোর্স পাওয়া যায় না), তাহলে একটি মেসেজ প্রিন্ট করা হয়।
  3. addInterceptorFirst() এবং addInterceptorLast(): এগুলি HTTP ক্লায়েন্টের জন্য ইন্টারসেপ্টর যোগ করার পদ্ধতি। addInterceptorFirst() ইন্টারসেপ্টরটি প্রথমে চলবে এবং addInterceptorLast() ইন্টারসেপ্টরটি রিকুয়েস্ট প্রক্রিয়া শেষে চলবে।
  4. setDefaultRequestConfig(requestConfig): রিকুয়েস্টের জন্য টাইমআউট কনফিগার করা হয়েছে, যেমন কানেকশন এবং সোকেট টাইমআউট।
  5. httpClient.execute(request): HTTP GET রিকুয়েস্টটি প্রেরণ করা হয়েছে এবং রেসপন্সের স্ট্যাটাস কোড এবং কন্টেন্ট গ্রহণ করা হয়েছে।

অতিরিক্ত কনফিগারেশন:

  • Custom Logging: আপনি রিকুয়েস্ট এবং রেসপন্সের জন্য লগিং যোগ করতে পারেন, যাতে HTTP রিকুয়েস্ট এবং রেসপন্সের সময় লগ তৈরি করা হয়।
  • Custom Authentication: আপনি একটি কাস্টম ইন্টারসেপ্টর তৈরি করে রিকুয়েস্টের সাথে স্বয়ংক্রিয়ভাবে প্রমাণীকরণ হেডার যোগ করতে পারেন।
  • Exception Handling: ইন্টারসেপ্টরের মধ্যে আপনি কাস্টম এক্সসেপশন হ্যান্ডলিং যোগ করতে পারেন, যেমন সার্ভার সাইড এরর 500 হলে পুনরায় চেষ্টা করা।

সারাংশ:

Custom Request/Response Interceptors অ্যাপাচি HTTP ক্লায়েন্টে আপনার রিকুয়েস্ট এবং রেসপন্স প্রক্রিয়া কাস্টমাইজ করতে সহায়ক। রিকুয়েস্ট ইন্টারসেপ্টর আপনাকে কাস্টম হেডার বা কন্টেন্ট পরিবর্তন করতে দেয়, এবং রেসপন্স ইন্টারসেপ্টর আপনাকে রেসপন্সের স্ট্যাটাস কোড পর্যালোচনা বা কাস্টম লজিক প্রয়োগ করতে দেয়। এটি উন্নত লগিং, সিকিউরিটি, এবং অন্যান্য ফিচার যোগ করতে একটি শক্তিশালী সরঞ্জাম।

common.content_added_by

Custom Connection Manager এবং Retry Mechanism

182
182

অ্যাপাচি HTTP ক্লায়েন্ট (Apache HTTP Client)Custom Connection Manager এবং Retry Mechanism ব্যবহারের মাধ্যমে আপনি HTTP কানেকশন ব্যবস্থাপনা কাস্টমাইজ করতে পারেন এবং রিট্রাই অপশন সংযুক্ত করতে পারেন। এই দুটি ফিচার আপনাকে HTTP ক্লায়েন্টের পারফরম্যান্স এবং স্থিতিশীলতা উন্নত করতে সহায়ক।

1. Custom Connection Manager

Custom Connection Manager ব্যবহার করে আপনি HTTP কানেকশনগুলি আরও বেশি কাস্টমাইজ এবং নিয়ন্ত্রণ করতে পারেন। অ্যাপাচি HTTP ক্লায়েন্টে, আপনি কাস্টম কানেকশন ম্যানেজার তৈরি করে বিভিন্ন সার্ভারের সাথে কানেকশন পুল ম্যানেজ করতে পারবেন। এটি কার্যকর হতে পারে যখন আপনি একাধিক সার্ভারের সাথে কানেকশন তৈরি করতে চান বা নির্দিষ্ট সার্ভারের জন্য আলাদা প্যারামিটার ব্যবহার করতে চান।

Custom Connection Manager তৈরি করা:

import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.pool.PoolStats;
import org.apache.hc.client5.http.impl.pool.BasicHttpClientConnectionManager;
import org.apache.hc.core5.pool.PoolEntry;

public class CustomConnectionManagerExample {
    public static void main(String[] args) throws Exception {
        // Custom connection manager তৈরি করা
        BasicHttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager();

        // Connection pool-এর পরিসংখ্যান দেখতে পারেন
        PoolStats poolStats = connectionManager.getTotalStats();
        System.out.println("Total connections: " + poolStats.getAvailable() + " available connections");

        // HTTP ক্লায়েন্ট তৈরি করা
        try (CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager) // Custom connection manager সেট করা
                .build()) {

            // GET অনুরোধ তৈরি করা
            HttpGet request = new HttpGet("https://example.com");

            // HTTP অনুরোধ পাঠানো
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                System.out.println("HTTP Response Status Code: " + response.getCode());
            }
        }
    }
}

ব্যাখ্যা:

  • BasicHttpClientConnectionManager: এটি একটি কানেকশন ম্যানেজার যা HTTP কানেকশন পুল ম্যানেজমেন্ট করে।
  • PoolStats: এই ক্লাসটি পুলে থাকা সক্রিয় এবং উপলব্ধ কানেকশনগুলির পরিসংখ্যান প্রদান করে।

2. Retry Mechanism

Retry Mechanism অ্যাপাচি HTTP ক্লায়েন্টে খুবই গুরুত্বপূর্ণ, বিশেষত যখন সার্ভারটি অস্থির থাকে অথবা সংযোগ সময়সীমা অতিবাহিত হয়ে যায়। আপনি কাস্টম রিট্রাই লজিক যোগ করতে পারেন, যেমন অনুরোধের ব্যর্থতার পর কিছু নির্দিষ্ট সংখ্যক রিটার্ন চেষ্টা করা।

Retry Mechanism উদাহরণ:

import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.DefaultHttpRequestRetryHandler;
import org.apache.hc.client5.http.impl.classic.HttpRequestRetryHandler;
import org.apache.hc.core5.http.ParseException;
import java.io.IOException;

public class RetryMechanismExample {
    public static void main(String[] args) throws Exception {
        // Custom Retry Handler তৈরি করা (3 বার retry করবে)
        HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(3, true);

        // HTTP ক্লায়েন্ট তৈরি করা, যাতে retry mechanism সেট করা হয়
        try (CloseableHttpClient httpClient = HttpClients.custom()
                .setRetryHandler(retryHandler)  // Retry handler যোগ করা
                .build()) {

            // GET অনুরোধ তৈরি করা
            HttpGet request = new HttpGet("https://example.com");

            // HTTP অনুরোধ পাঠানো এবং পুনঃচেষ্টা করা
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                System.out.println("HTTP Response Status Code: " + response.getCode());
            }
        }
    }
}

ব্যাখ্যা:

  • DefaultHttpRequestRetryHandler: এটি একটি পূর্বনির্ধারিত রিট্রাই মেকানিজম, যা HTTP অনুরোধ ব্যর্থ হলে কিছু নির্দিষ্ট সংখ্যক রিটার্ন চেষ্টা করে। উপরের উদাহরণে, এটি ৩ বার চেষ্টা করবে।
  • setRetryHandler(retryHandler): এটি ক্লায়েন্টে রিট্রাই মেকানিজম সেট করার জন্য ব্যবহৃত হয়।
  • রিটার্ন চেষ্টা করার জন্য প্যারামিটারগুলির মধ্যে অন্তর্ভুক্ত থাকে - retry count এবং নির্দিষ্ট HTTP স্ট্যাটাস কোডগুলি (যেমন, 500 Internal Server Error বা 503 Service Unavailable)।

3. Custom Retry Logic

আপনি যদি একটি কাস্টম রিট্রাই লজিক তৈরি করতে চান, তবে আপনি নিজস্ব HttpRequestRetryHandler ইমপ্লিমেন্ট করতে পারেন, যা নির্দিষ্ট শর্তের উপর ভিত্তি করে রিটার্ন চেষ্টা করবে।

Custom Retry Handler উদাহরণ:

import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpRequestRetryHandler;
import org.apache.hc.core5.http.ParseException;
import java.io.IOException;
import org.apache.hc.client5.http.impl.classic.DefaultHttpRequestRetryHandler;

public class CustomRetryHandlerExample {
    public static void main(String[] args) throws Exception {
        // Custom retry handler ইমপ্লিমেন্ট করা
        HttpRequestRetryHandler customRetryHandler = (exception, executionCount, context) -> {
            if (executionCount > 3) {  // ৩বারের বেশি retry না করবে
                return false;
            }
            if (exception instanceof IOException) {  // শুধু IOException এ retry হবে
                return true;
            }
            return false;
        };

        // HTTP ক্লায়েন্ট তৈরি করা, যাতে custom retry handler সেট করা হয়
        try (CloseableHttpClient httpClient = HttpClients.custom()
                .setRetryHandler(customRetryHandler)  // Custom retry handler যোগ করা
                .build()) {

            // GET অনুরোধ তৈরি করা
            HttpGet request = new HttpGet("https://example.com");

            // HTTP অনুরোধ পাঠানো এবং পুনঃচেষ্টা করা
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                System.out.println("HTTP Response Status Code: " + response.getCode());
            }
        }
    }
}

ব্যাখ্যা:

  • এখানে, কাস্টম রিট্রাই হ্যান্ডলার তৈরি করা হয়েছে যা শুধুমাত্র IOException এর জন্য রিট্রাই করবে এবং সর্বোচ্চ ৩ বার রিট্রাই করবে।
  • executionCount > 3: এটা চেক করে যে, ৩ বার রিট্রাই করার পর আরও রিটার্ন চেষ্টা না করা হয়।

সারাংশ

  • Custom Connection Manager: এটি HTTP কানেকশন পুলের কার্যক্রম নিয়ন্ত্রণ করতে ব্যবহৃত হয়, এবং এটি কাস্টম কানেকশন পুলিং কৌশলগুলি অ্যাপ্লাই করতে সাহায্য করে।
  • Retry Mechanism: এটি HTTP অনুরোধের ব্যর্থতার পর পুনরায় চেষ্টা করার জন্য ব্যবহৃত হয়। আপনি DefaultHttpRequestRetryHandler ব্যবহার করতে পারেন অথবা কাস্টম HttpRequestRetryHandler তৈরি করতে পারেন।

এই দুটি ফিচার আপনাকে ক্লায়েন্টের পারফরম্যান্স এবং স্থিতিশীলতা উন্নত করতে সাহায্য করতে পারে, বিশেষত যখন সার্ভার অস্থির থাকে অথবা সংযোগের সমস্যা হয়।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion