You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jg...@apache.org on 2007/09/06 21:58:44 UTC

svn commit: r573352 - in /geronimo/sandbox/AsyncHttpClient: pom.xml src/main/java/org/apache/ahc/AsyncHttpClient.java src/main/java/org/apache/ahc/codec/HttpIoHandler.java

Author: jgenender
Date: Thu Sep  6 12:58:44 2007
New Revision: 573352

URL: http://svn.apache.org/viewvc?rev=573352&view=rev
Log:
Use queues to allow the connect to be asynchronous as well

Modified:
    geronimo/sandbox/AsyncHttpClient/pom.xml
    geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/AsyncHttpClient.java
    geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpIoHandler.java

Modified: geronimo/sandbox/AsyncHttpClient/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/pom.xml?rev=573352&r1=573351&r2=573352&view=diff
==============================================================================
--- geronimo/sandbox/AsyncHttpClient/pom.xml (original)
+++ geronimo/sandbox/AsyncHttpClient/pom.xml Thu Sep  6 12:58:44 2007
@@ -38,12 +38,12 @@
         <dependency>
             <groupId>org.apache.mina</groupId>
             <artifactId>mina-core</artifactId>
-            <version>1.1.1</version>
+            <version>1.1.2</version>
         </dependency>
         <dependency>
             <groupId>org.apache.mina</groupId>
             <artifactId>mina-filter-ssl</artifactId>
-            <version>1.1.1</version>
+            <version>1.1.2</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>

Modified: geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/AsyncHttpClient.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/AsyncHttpClient.java?rev=573352&r1=573351&r2=573352&view=diff
==============================================================================
--- geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/AsyncHttpClient.java (original)
+++ geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/AsyncHttpClient.java Thu Sep  6 12:58:44 2007
@@ -19,23 +19,24 @@
  */
 package org.apache.ahc;
 
-import org.apache.mina.transport.socket.nio.SocketConnector;
-import org.apache.mina.common.IoConnectorConfig;
+import org.apache.ahc.codec.HttpIoHandler;
+import org.apache.ahc.codec.HttpProtocolCodecFactory;
+import org.apache.ahc.codec.HttpRequestMessage;
+import org.apache.ahc.ssl.TrustManagerFactoryImpl;
 import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.IoConnectorConfig;
 import org.apache.mina.common.IoSession;
 import org.apache.mina.filter.SSLFilter;
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.ahc.ssl.TrustManagerFactoryImpl;
-import org.apache.ahc.codec.HttpRequestMessage;
-import org.apache.ahc.codec.HttpProtocolCodecFactory;
-import org.apache.ahc.codec.HttpIoHandler;
-import org.apache.ahc.util.AsyncHttpClientException;
+import org.apache.mina.transport.socket.nio.SocketConnector;
 
 import javax.net.ssl.SSLContext;
-import java.net.URL;
 import java.net.InetSocketAddress;
+import java.net.URL;
 import java.security.GeneralSecurityException;
-import java.io.IOException;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
 
 public class AsyncHttpClient {
 
@@ -50,9 +51,11 @@
     private IoSession session;
     private AsyncHttpClientCallback callback;
     private int requestTimeout = DEFAULT_REQUEST_TIMEOUT;
+    private List<HttpRequestMessage> sendQueue = Collections.synchronizedList(new LinkedList<HttpRequestMessage>());
+    private ConnectionListener connectionListener = new ConnectionListener();
 
     public AsyncHttpClient(URL url, AsyncHttpClientCallback callback) {
-        this(url, callback,DEFAULT_CONNECTION_TIMEOUT, DEFAULT_REQUEST_TIMEOUT);
+        this(url, callback, DEFAULT_CONNECTION_TIMEOUT, DEFAULT_REQUEST_TIMEOUT);
     }
 
     public AsyncHttpClient(URL url, AsyncHttpClientCallback callback, int connectionTimeout) {
@@ -67,10 +70,11 @@
     }
 
     public void connect() throws Exception {
+        sendQueue.clear();
         SocketConnector connector = new SocketConnector();
         IoConnectorConfig cfg = connector.getDefaultConfig();
 
-        cfg.setConnectTimeout(connectionTimeout/1000);
+        cfg.setConnectTimeout(connectionTimeout / 1000);
 
         String scheme = url.getProtocol();
         int port = url.getPort();
@@ -86,14 +90,9 @@
             port = 80;
         }
 
-        cfg.getFilterChain().addLast("protocolFilter",new ProtocolCodecFilter( new HttpProtocolCodecFactory(url)));
+        cfg.getFilterChain().addLast("protocolFilter", new ProtocolCodecFilter(new HttpProtocolCodecFactory(url)));
 
-        ConnectFuture future = connector.connect(new InetSocketAddress(url.getHost(), port), new HttpIoHandler(callback, requestTimeout));
-        future.join();
-        if (!future.isConnected()) {
-            throw new IOException("Cannot connect to " + url.toString());
-        }
-        session = future.getSession();
+        ConnectFuture future = connector.connect(new InetSocketAddress(url.getHost(), port), new HttpIoHandler(connectionListener, callback, requestTimeout));
     }
 
     public void disconnect() {
@@ -103,12 +102,9 @@
         session = null;
     }
 
-    public void sendRequest(HttpRequestMessage message){
-        if (session == null || !session.isConnected()){
-            callback.onException(new AsyncHttpClientException("Objectdoes not have a valid connection to a server."));
-            return;
-        }
-        session.write(message);
+    public void sendRequest(HttpRequestMessage message) {
+        sendQueue.add(message);
+        processSendQueue();
     }
 
     public int getConnectionTimeout() {
@@ -127,10 +123,27 @@
         this.sslProtocol = sslProtocol;
     }
 
+    private synchronized void processSendQueue() {
+        if (session != null && session.isConnected()) {
+            while (sendQueue.size() > 0) {
+                //Process messages in FIFO
+                HttpRequestMessage message = sendQueue.remove(0);
+                session.write(message);
+            }
+        }
+    }
+
     private SSLContext createClientSSLContext() throws GeneralSecurityException {
         SSLContext context = SSLContext.getInstance(sslProtocol);
         context.init(null, TrustManagerFactoryImpl.X509_MANAGERS, null);
         return context;
+    }
+
+    public class ConnectionListener {
+        public void onConnected(IoSession sess) {
+            session = sess;
+            processSendQueue();
+        }
     }
 
 }

Modified: geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpIoHandler.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpIoHandler.java?rev=573352&r1=573351&r2=573352&view=diff
==============================================================================
--- geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpIoHandler.java (original)
+++ geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpIoHandler.java Thu Sep  6 12:58:44 2007
@@ -22,6 +22,7 @@
 import org.apache.mina.common.IoHandlerAdapter;
 import org.apache.mina.common.IoSession;
 import org.apache.ahc.AsyncHttpClientCallback;
+import org.apache.ahc.AsyncHttpClient;
 
 import java.util.LinkedList;
 import java.util.Collections;
@@ -40,8 +41,10 @@
     private List<HttpRequestMessage> sentQueue = Collections.synchronizedList(new LinkedList<HttpRequestMessage>());
     private ScheduledThreadPoolExecutor scheduler = null;
     private int timeoutDelay;
+    private AsyncHttpClient.ConnectionListener connectionListener = null;
 
-    public HttpIoHandler(AsyncHttpClientCallback callback, int timeoutDelay) {
+    public HttpIoHandler(AsyncHttpClient.ConnectionListener connectionListener, AsyncHttpClientCallback callback, int timeoutDelay) {
+        this.connectionListener = connectionListener;
         this.callback = callback;
         this.timeoutDelay = timeoutDelay;
     }
@@ -54,6 +57,7 @@
             //to prevent memory leaks
             scheduler.scheduleWithFixedDelay(new SchedulePurger(), 5000, 5000, TimeUnit.MILLISECONDS);
         }
+        connectionListener.onConnected(ioSession);
     }
 
     public void messageReceived(IoSession ioSession, Object object) throws Exception {