Labeo
Labeo

Reputation: 6369

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();
       }

    }

Upvotes: 0

Views: 392

Answers (1)

Filip
Filip

Reputation: 1244

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 :)

Upvotes: 1

Related Questions