Search code examples
javasslconnection-pooling

How to check weather client is using PoolingHttpClientConnectionManager in java


I am trying to use connection Pooling on a server(Https SSL Configured) from my client code i am using PoolingHttpClientConnectionManager and i have a working code with connection pooling but i want to know weather my code is using PoolingHttpClientConnectionManager or not how to figure it out

If my code is not using pooling manager how to make it use it

my code:

static PoolingHttpClientConnectionManager cm ;
    static CloseableHttpClient httpClient;
    static
    {


        SslConfigurator sslConfig = SslConfigurator.newInstance()
                .securityProtocol("TLS")
                .keyStoreFile("/path")
                .keyStorePassword("passw")
                .keyStoreType("JKS")
                .trustStoreFile("/path");

        SSLContext sslCtx = sslConfig.createSSLContext();
        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslCtx,NoopHostnameVerifier.INSTANCE);
        HttpClientContext clientContext = HttpClientContext.create();


        final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", sslSocketFactory)
                .build();


        cm = new PoolingHttpClientConnectionManager(registry);

        client = HttpClients.custom()
                .setSSLSocketFactory(sslSocketFactory)
                .setConnectionManager(cm)
                .build();

    }
    public static void main(String a[]) throws ClientProtocolException, IOException, JSONException
    {

        JSONObject jsonResponse;




         StringEntity se = new StringEntity(jsonRequest.toString());

        HttpPost httpPost = new HttpPost(path);
        httpPost.setEntity(se);
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
        httpPost.setHeader("Connection", "keep-alive");
        CloseableHttpResponse response2; 
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS");



        int i;
        for(i=0;i<10;i++)
       {
            response2 = client.execute(httpPost);

        System.out.println(response2.getStatusLine());
        HttpEntity entity2 = response2.getEntity();

        String result = EntityUtils.toString(entity2);
        System.out.println(result);

        Date date = new Date();
        System.out.println(dateFormat.format(date));
       response2.close();
       }

    }

Solution

  • Here's some sort of rule of thumb when confronted with such intricate questions...

    Create a simple class, say 'BrokenPHCCM', which extends org.apache.http.impl.conn.PoolingHttpClientConnectionManager and in this new class just override the org.apache.http.impl.conn.PoolingHttpClientConnectionManager#connect method to basically throw a java.lang.RuntimeException instead.

    When you're going to pass an instance of this type to the http client builder .setConnectionManager(brokenCM) and attempt to connect you should get the runtime exception, right?

    Here's a simplified version of what I was getting at with this

    public static class BrokenPoolingHttpClientConnectionManager
              extends PoolingHttpClientConnectionManager 
    {
    
        public BrokenPoolingHttpClientConnectionManager(
                Registry<ConnectionSocketFactory> socketFactoryRegistry) {
    
            super(socketFactoryRegistry);
        }
    
        @Override
        public void connect(
                        HttpClientConnection managedConn, 
                        HttpRoute route, 
                        int connectTimeout, 
                        HttpContext context) throws IOException  {
    
            throw new RuntimeException("As expected");
        }
    }
    
    static PoolingHttpClientConnectionManager cm;
    static CloseableHttpClient httpClient;
    
    static {
    
            HttpClientContext clientContext = HttpClientContext.create();
    
            final Registry<ConnectionSocketFactory>
                registry =
                RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .build();
    
            cm = new BrokenPoolingHttpClientConnectionManager(registry);
    
            httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .build();
    
    }
    
    
    public static void main(String a[]) throws ClientProtocolException, IOException, JSONException {
    
            HttpGet httpRequest = new HttpGet("http://www.google.com/");
            httpRequest.setHeader("Connection", "keep-alive");
            CloseableHttpResponse response2;
            DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS");
    
            int i;
            for (i = 0; i < 10; i++) {
              response2 = httpClient.execute(httpRequest);
    
              System.out.println(String.format("response status=%s", response2.getStatusLine()));
    
              String result = EntityUtils.toString(response2.getEntity());
              System.out.println(String.format("response size=%d", result.length()));
    
              Date date = new Date();
              System.out.println(dateFormat.format(date));
              response2.close();
            }
    }
    

    Your console will show something like this:

    Exception in thread "main" java.lang.RuntimeException: As expected at com.something.Demo$BrokenPoolingHttpClientConnectionManager.connect(Demo.java:43) at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) at com.something.Demo.main(Demo.java:78) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

    Other than that you should rely on documentation and things such as the static typing aspect of java :)