You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by ol...@apache.org on 2014/03/12 02:48:45 UTC

svn commit: r1576558 - in /incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube: CubeBuilder.java CubeDisruptorDataStoreFactory.java HttpClientCube.java HttpClientCubeBuilder.java

Author: olamy
Date: Wed Mar 12 01:48:44 2014
New Revision: 1576558

URL: http://svn.apache.org/r1576558
Log:
add an async httpclient
more configuration
No need to build so many Cube instances

Modified:
    incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java
    incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeDisruptorDataStoreFactory.java
    incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCube.java
    incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCubeBuilder.java

Modified: incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java?rev=1576558&r1=1576557&r2=1576558&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java (original)
+++ incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeBuilder.java Wed Mar 12 01:48:44 2014
@@ -18,6 +18,7 @@ package org.apache.sirona.cube;
 
 import org.apache.sirona.SironaException;
 import org.apache.sirona.configuration.ioc.AutoSet;
+import org.apache.sirona.configuration.ioc.Created;
 import org.apache.sirona.util.Localhosts;
 
 import javax.net.ssl.KeyManager;
@@ -59,15 +60,44 @@ public class CubeBuilder {
      */
     private int postTimeout = 5000;
 
+    /**
+     * only for httpclient
+     */
     private int maxTotalConnections = 10;
 
+    /**
+     * only for httpclient
+     */
     private int defaultMaxPerRoute = 10;
 
+    /**
+     * only for httpclient
+     */
     private int connectionTimeout = 5000;
 
+    /**
+     * only for httpclient
+     */
     private int connectionRequestTimeout = 5000;
 
+    /**
+     * only for httpclient
+     */
+    private boolean useAsync;
+
+    private Cube cubeInstance;
+
+    @Created
+    public void createInstance()
+    {
+        cubeInstance = this.build();
+    }
+
     public synchronized Cube build() {
+        if (cubeInstance != null)
+        {
+            return cubeInstance;
+        }
         if (marker == null) {
             marker = Localhosts.get();
         }
@@ -251,6 +281,106 @@ public class CubeBuilder {
         return connectionRequestTimeout;
     }
 
+    public void setProxyHost( String proxyHost )
+    {
+        this.proxyHost = proxyHost;
+    }
+
+    public void setProxyPort( int proxyPort )
+    {
+        this.proxyPort = proxyPort;
+    }
+
+    public void setCollector( String collector )
+    {
+        this.collector = collector;
+    }
+
+    public void setMarker( String marker )
+    {
+        this.marker = marker;
+    }
+
+    public void setSocketFactory( SSLSocketFactory socketFactory )
+    {
+        this.socketFactory = socketFactory;
+    }
+
+    public void setSslTrustStore( String sslTrustStore )
+    {
+        this.sslTrustStore = sslTrustStore;
+    }
+
+    public void setSslTrustStoreType( String sslTrustStoreType )
+    {
+        this.sslTrustStoreType = sslTrustStoreType;
+    }
+
+    public void setSslTrustStorePassword( String sslTrustStorePassword )
+    {
+        this.sslTrustStorePassword = sslTrustStorePassword;
+    }
+
+    public void setSslTrustStoreProvider( String sslTrustStoreProvider )
+    {
+        this.sslTrustStoreProvider = sslTrustStoreProvider;
+    }
+
+    public void setSslKeyStore( String sslKeyStore )
+    {
+        this.sslKeyStore = sslKeyStore;
+    }
+
+    public void setSslKeyStoreType( String sslKeyStoreType )
+    {
+        this.sslKeyStoreType = sslKeyStoreType;
+    }
+
+    public void setSslKeyStorePassword( String sslKeyStorePassword )
+    {
+        this.sslKeyStorePassword = sslKeyStorePassword;
+    }
+
+    public void setSslKeyStoreProvider( String sslKeyStoreProvider )
+    {
+        this.sslKeyStoreProvider = sslKeyStoreProvider;
+    }
+
+    public void setBasicHeader( String basicHeader )
+    {
+        this.basicHeader = basicHeader;
+    }
+
+    public void setMaxTotalConnections( int maxTotalConnections )
+    {
+        this.maxTotalConnections = maxTotalConnections;
+    }
+
+    public void setDefaultMaxPerRoute( int defaultMaxPerRoute )
+    {
+        this.defaultMaxPerRoute = defaultMaxPerRoute;
+    }
+
+    public void setConnectionTimeout( int connectionTimeout )
+    {
+        this.connectionTimeout = connectionTimeout;
+    }
+
+    public void setConnectionRequestTimeout( int connectionRequestTimeout )
+    {
+        this.connectionRequestTimeout = connectionRequestTimeout;
+    }
+
+    public boolean isUseAsync()
+    {
+        return useAsync;
+    }
+
+    public void setUseAsync( boolean useAsync )
+    {
+        this.useAsync = useAsync;
+    }
+
     @Override
     public String toString() {
         return "CubeBuilder{" + collector + '}';

Modified: incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeDisruptorDataStoreFactory.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeDisruptorDataStoreFactory.java?rev=1576558&r1=1576557&r2=1576558&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeDisruptorDataStoreFactory.java (original)
+++ incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/CubeDisruptorDataStoreFactory.java Wed Mar 12 01:48:44 2014
@@ -26,6 +26,7 @@ public class CubeDisruptorDataStoreFacto
             IoCs.processInstance(new CubeCounterDataStore()),
             IoCs.processInstance(new CubeGaugeDataStore()),
             IoCs.processInstance(new CubeNodeStatusDataStore()),
-            IoCs.processInstance(new DisruptorPathTrackingDataStore()));
+            IoCs.findOrCreateInstance( DisruptorPathTrackingDataStore.class ));
+        //  IoCs.processInstance(new DisruptorPathTrackingDataStore())
     }
 }

Modified: incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCube.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCube.java?rev=1576558&r1=1576557&r2=1576558&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCube.java (original)
+++ incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCube.java Wed Mar 12 01:48:44 2014
@@ -22,9 +22,17 @@ import org.apache.http.client.HttpClient
 import org.apache.http.client.ResponseHandler;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.HttpPost;
+import org.apache.http.concurrent.FutureCallback;
 import org.apache.http.entity.ByteArrayEntity;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
+import org.apache.http.impl.nio.client.HttpAsyncClients;
+import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
+import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
+import org.apache.http.impl.nio.reactor.IOReactorConfig;
+import org.apache.http.nio.conn.NHttpClientConnectionManager;
+import org.apache.http.nio.reactor.ConnectingIOReactor;
 
 import java.io.IOException;
 import java.net.URI;
@@ -43,6 +51,8 @@ public class HttpClientCube
 
     private HttpClient httpclient;
 
+    private CloseableHttpAsyncClient closeableHttpAsyncClient;
+
     private RequestConfig requestConfig;
 
     public HttpClientCube( CubeBuilder cubeBuilder )
@@ -50,17 +60,6 @@ public class HttpClientCube
         super( cubeBuilder );
         try
         {
-            HttpClientBuilder builder = HttpClientBuilder.create();
-
-            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
-
-            connectionManager.setMaxTotal( cubeBuilder.getMaxTotalConnections() );
-
-            connectionManager.setDefaultMaxPerRoute( cubeBuilder.getDefaultMaxPerRoute() );
-
-            builder = builder.setConnectionManager( connectionManager );
-
-            httpclient = builder.build();
 
             requestConfig = RequestConfig.custom() //
                 .setSocketTimeout( cubeBuilder.getPostTimeout() ) //
@@ -68,6 +67,38 @@ public class HttpClientCube
                 .setConnectionRequestTimeout( cubeBuilder.getConnectionRequestTimeout() ) //
                 .build();
 
+            if ( cubeBuilder.isUseAsync() )
+            {
+                IOReactorConfig ioReactorConfig =
+                    IOReactorConfig.custom().setIoThreadCount( Runtime.getRuntime().availableProcessors() - 1 ) //
+                        .setConnectTimeout( cubeBuilder.getConnectionTimeout() ) //
+                        .setSoTimeout( cubeBuilder.getPostTimeout() ) //
+                        .build();
+
+                ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor( ioReactorConfig );
+                NHttpClientConnectionManager manager = new PoolingNHttpClientConnectionManager( ioReactor );
+                closeableHttpAsyncClient = HttpAsyncClients.custom() //
+                    .setConnectionManager( manager ) //
+                    .setMaxConnPerRoute( cubeBuilder.getDefaultMaxPerRoute() ) //
+                    .setMaxConnTotal( cubeBuilder.getMaxTotalConnections() ) //
+                    .build();
+                closeableHttpAsyncClient.start();
+            }
+            else
+            {
+                HttpClientBuilder builder = HttpClientBuilder.create();
+
+                PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
+
+                connectionManager.setMaxTotal( cubeBuilder.getMaxTotalConnections() );
+
+                connectionManager.setDefaultMaxPerRoute( cubeBuilder.getDefaultMaxPerRoute() );
+
+                builder = builder.setConnectionManager( connectionManager );
+
+                httpclient = builder.build();
+            }
+
         }
         catch ( Exception e )
         {
@@ -90,22 +121,52 @@ public class HttpClientCube
             httpPost.setHeader( X_SIRONA_CLASSNAME, className );
 
             httpPost.setConfig( requestConfig );
-
-            httpclient.execute( httpPost, new ResponseHandler<HttpResponse>()
+            if ( this.getConfig().isUseAsync() )
             {
-                public HttpResponse handleResponse( HttpResponse httpResponse )
-                    throws ClientProtocolException, IOException
+                closeableHttpAsyncClient.execute( httpPost, new FutureCallback<HttpResponse>()
                 {
-                    int status = httpResponse.getStatusLine().getStatusCode();
-                    if ( status != 200 )
+                    @Override
+                    public void completed( HttpResponse httpResponse )
+                    {
+                        int status = httpResponse.getStatusLine().getStatusCode();
+                        if ( status != 200 )
+                        {
+                            LOGGER.warning( "Pushed data but response code is: " + status + //
+                                                ", reason:" + httpResponse.getStatusLine().getReasonPhrase() );
+                        }
+                    }
+
+                    @Override
+                    public void failed( Exception e )
                     {
-                        LOGGER.warning( "Pushed data but response code is: " + status + //
-                                            ", reason:" + httpResponse.getStatusLine().getReasonPhrase() );
+                        LOGGER.warning( "Failed to push data: " + e.getMessage() );
                     }
-                    return httpResponse;
-                }
-            } );
 
+                    @Override
+                    public void cancelled()
+                    {
+                        LOGGER.warning( "Push data cancelled " );
+                    }
+                } );
+            }
+            else
+            {
+
+                httpclient.execute( httpPost, new ResponseHandler<HttpResponse>()
+                {
+                    public HttpResponse handleResponse( HttpResponse httpResponse )
+                        throws ClientProtocolException, IOException
+                    {
+                        int status = httpResponse.getStatusLine().getStatusCode();
+                        if ( status != 200 )
+                        {
+                            LOGGER.warning( "Pushed data but response code is: " + status + //
+                                                ", reason:" + httpResponse.getStatusLine().getReasonPhrase() );
+                        }
+                        return httpResponse;
+                    }
+                } );
+            }
         }
         catch ( URISyntaxException e )
         {

Modified: incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCubeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCubeBuilder.java?rev=1576558&r1=1576557&r2=1576558&view=diff
==============================================================================
--- incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCubeBuilder.java (original)
+++ incubator/sirona/trunk/agent/store/cube/src/main/java/org/apache/sirona/cube/HttpClientCubeBuilder.java Wed Mar 12 01:48:44 2014
@@ -17,6 +17,7 @@
 package org.apache.sirona.cube;
 
 import org.apache.sirona.configuration.ioc.AutoSet;
+import org.apache.sirona.configuration.ioc.Created;
 
 /**
  * @author Olivier Lamy
@@ -25,9 +26,22 @@ import org.apache.sirona.configuration.i
 public class HttpClientCubeBuilder
     extends CubeBuilder
 {
+
+    private Cube cubeInstance;
+
+    @Created
+    public void createInstance()
+    {
+        cubeInstance = this.build();
+    }
+
     @Override
     public synchronized Cube build()
     {
+        if (cubeInstance != null)
+        {
+            return cubeInstance;
+        }
         return new HttpClientCube( this );
     }
 }