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/24 22:31:29 UTC

svn commit: r578952 - in /geronimo/sandbox/AsyncHttpClient/src: main/java/org/apache/ahc/ main/java/org/apache/ahc/codec/ test/java/org/apache/ahc/

Author: jgenender
Date: Mon Sep 24 13:31:28 2007
New Revision: 578952

URL: http://svn.apache.org/viewvc?rev=578952&view=rev
Log:
Added timeout code back in

Modified:
    geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/AsyncHttpClient.java
    geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpIoHandler.java
    geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpRequestMessage.java
    geronimo/sandbox/AsyncHttpClient/src/test/java/org/apache/ahc/TimeoutTest.java

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=578952&r1=578951&r2=578952&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 Mon Sep 24 13:31:28 2007
@@ -34,9 +34,13 @@
 import java.security.GeneralSecurityException;
 import java.util.concurrent.ExecutorService;
 
+/**
+ * Main class to use for sending asyncronous HTTP requests to servers.
+ * Only one or a few of these objects should be used in an application since
+ * it manages the threads and requests to multiple seperate servers/sockets.
+ */
 public class AsyncHttpClient {
 
-    public static final int DEFAULT_REQUEST_TIMEOUT = 30000;
     public static final int DEFAULT_CONNECTION_TIMEOUT = 30000;
     public static final String DEFAULT_SSL_PROTOCOL = "TLS";
 
@@ -44,26 +48,24 @@
 
     private int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT;
     private SocketConnector connector;
-    private int requestTimeout = DEFAULT_REQUEST_TIMEOUT;
     private static ExecutorService threadPool;
-    private IoHandler handler = new HttpIoHandler();
+    private HttpIoHandler handler = new HttpIoHandler();
     private SSLFilter sslFilter;
 
     public AsyncHttpClient() {
-        this(DEFAULT_CONNECTION_TIMEOUT, DEFAULT_REQUEST_TIMEOUT, null);
+        this(DEFAULT_CONNECTION_TIMEOUT, null);
     }
 
     public AsyncHttpClient(ExecutorService executor) {
-        this(DEFAULT_CONNECTION_TIMEOUT, DEFAULT_REQUEST_TIMEOUT, executor);
+        this(DEFAULT_CONNECTION_TIMEOUT, executor);
     }
 
     public AsyncHttpClient(int connectionTimeout) {
-        this(connectionTimeout, DEFAULT_REQUEST_TIMEOUT, null);
+        this(connectionTimeout, null);
     }
 
-    public AsyncHttpClient(int connectionTimeout, int requestTimeout, ExecutorService executor) {
+    public AsyncHttpClient(int connectionTimeout, ExecutorService executor) {
         this.connectionTimeout = connectionTimeout;
-        this.requestTimeout = requestTimeout;
 
         threadPool = executor;
 
@@ -97,9 +99,12 @@
     }
 
     public void destroyAll() {
+        handler.destroy();
+
         if (threadPool != null) {
             threadPool.shutdownNow();
         }
+
         if (connector != null){
             connector.setWorkerTimeout(0);
         }

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=578952&r1=578951&r2=578952&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 Mon Sep 24 13:31:28 2007
@@ -19,13 +19,15 @@
  */
 package org.apache.ahc.codec;
 
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.ahc.AsyncHttpClientCallback;
-import org.apache.mina.common.ConnectFuture;
 import org.apache.mina.common.IoHandlerAdapter;
 import org.apache.mina.common.IoSession;
 
-import java.util.concurrent.ConcurrentHashMap;
-
 public class HttpIoHandler extends IoHandlerAdapter {
     
     public static final String CURRENT_REQUEST = "CURRENT_REQUEST";
@@ -34,30 +36,27 @@
     public static final int DEFAULT_THREAD_POOL_SIZE = 10;
     public static final String CONNECTION_CLOSE = "close";
 
-//    private ScheduledExecutorService scheduler;
+    private ScheduledExecutorService scheduler;
     
     public HttpIoHandler() {
+        scheduler = Executors.newSingleThreadScheduledExecutor();
     }
 
+    public void destroy(){
+        scheduler.shutdownNow();
+    }
+    
     public void sessionOpened(IoSession ioSession) throws Exception {
     }
 
     public void messageReceived(IoSession ioSession, Object object) throws Exception {
-        //For each send, we should have a response
+
         HttpResponseMessage response = (HttpResponseMessage)object;
-        //Remove the sent message
-//        HttpRequestMessage request = sentQueue.poll();
-//        ScheduledFuture handle = request.getTimeoutHandle();
-//        if (handle != null) {
-//
-//            boolean canceled = handle.cancel(true);
-//            //See if it canceled
-//            if (!canceled) {
-//                //Couldn't cancel it and it ran, so too late :-(
-//                return;
-//            }
-//        }
+
         HttpRequestMessage request = (HttpRequestMessage)ioSession.getAttribute(CURRENT_REQUEST);
+
+        cancelTasks(request);
+
         AsyncHttpClientCallback callback = request.getCallback();
         callback.onResponse(response);
         ioSession.close();
@@ -66,10 +65,10 @@
     public void exceptionCaught(IoSession ioSession, Throwable throwable) throws Exception {
         //Clean up if any in-proccess decoding was occurring
         ioSession.removeAttribute(CURRENT_RESPONSE);
-//        if (timeoutDelay > 0) {
-//        }
 
         HttpRequestMessage request = (HttpRequestMessage)ioSession.getAttribute(CURRENT_REQUEST);
+        cancelTasks(request);
+
         AsyncHttpClientCallback callback = request.getCallback();
         callback.onException(throwable);
         
@@ -80,24 +79,36 @@
     public void sessionClosed(IoSession ioSession) throws Exception {
         //Clean up if any in-proccess decoding was occurring
         ioSession.removeAttribute(CURRENT_RESPONSE);
-//        if (timeoutDelay > 0) {
-//            scheduler.shutdownNow();
-//            scheduler = null;
-//        }
         HttpRequestMessage request = (HttpRequestMessage)ioSession.getAttribute(CURRENT_REQUEST);
+        cancelTasks(request);
         AsyncHttpClientCallback callback = request.getCallback();
         callback.onClosed();
     }
 
     public void messageSent(IoSession ioSession, Object object) throws Exception {
         HttpRequestMessage msg = (HttpRequestMessage)object;
-//        if (timeoutDelay > 0) {
-//            TimeoutTask task = new TimeoutTask(ioSession);
-//            scheduler.schedule(task, timeoutDelay, TimeUnit.MILLISECONDS);
-//        }
-    }
 
-   
+        //Start the tmeout timer now
+        if (msg.getTimeOut() > 0) {
+            TimeoutTask task = new TimeoutTask(ioSession);
+            ScheduledFuture handle = scheduler.schedule(task, msg.getTimeOut(), TimeUnit.MILLISECONDS);
+            msg.setTimeoutHandle(handle);
+        }
+    }
+
+    private void cancelTasks(HttpRequestMessage request){
+        ScheduledFuture handle = request.getTimeoutHandle();
+        if (handle != null){
+            boolean canceled = handle.cancel(true);
+            //See if it canceled
+            if (!canceled) {
+                //Couldn't cancel it and it ran, so too late :-(
+                return;
+            }
+            request.setTimeoutHandle(null);
+        }
+    }
+    
     class TimeoutTask implements Runnable {
 
         private IoSession sess;

Modified: geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpRequestMessage.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpRequestMessage.java?rev=578952&r1=578951&r2=578952&view=diff
==============================================================================
--- geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpRequestMessage.java (original)
+++ geronimo/sandbox/AsyncHttpClient/src/main/java/org/apache/ahc/codec/HttpRequestMessage.java Mon Sep 24 13:31:28 2007
@@ -29,6 +29,8 @@
 
 public class HttpRequestMessage extends HttpMessage {
 
+    public static final int DEFAULT_REQUEST_TIMEOUT = 30000;
+
     public static final String REQUEST_GET = "GET";
     public static final String REQUEST_POST = "POST";
     public static final String REQUEST_HEAD = "HEAD";
@@ -44,10 +46,19 @@
     private boolean followRedirects = true;
     private ScheduledFuture timeoutHandle;
     private AsyncHttpClientCallback callback;
+    private int timeOut = DEFAULT_REQUEST_TIMEOUT;
 
     public HttpRequestMessage(URL url, AsyncHttpClientCallback callback) {
         this.url = url;
         this.callback = callback;
+    }
+
+    public int getTimeOut() {
+        return timeOut;
+    }
+
+    public void setTimeOut(int timeOut) {
+        this.timeOut = timeOut;
     }
 
     protected ScheduledFuture getTimeoutHandle() {

Modified: geronimo/sandbox/AsyncHttpClient/src/test/java/org/apache/ahc/TimeoutTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/src/test/java/org/apache/ahc/TimeoutTest.java?rev=578952&r1=578951&r2=578952&view=diff
==============================================================================
--- geronimo/sandbox/AsyncHttpClient/src/test/java/org/apache/ahc/TimeoutTest.java (original)
+++ geronimo/sandbox/AsyncHttpClient/src/test/java/org/apache/ahc/TimeoutTest.java Mon Sep 24 13:31:28 2007
@@ -28,14 +28,15 @@
 
     public void testTimeout() throws Exception {
 
-        /**
         TestCallback callback = new TestCallback();
 
-        //Create a client with a one second timeout
-        AsyncHttpClient ahc = new AsyncHttpClient(30000, 1000, null);
+        AsyncHttpClient ahc = new AsyncHttpClient();
 
         HttpRequestMessage request = new HttpRequestMessage(new URL("http://localhost:8282/timeout.jsp"), callback);
 
+        //Create a client with a one second timeout
+        request.setTimeOut(1000);
+
         ahc.sendRequest(request);
 
         //We are done...Thread would normally end...
@@ -46,7 +47,7 @@
         }
 
         assertTrue(callback.isTimeout());
-     **/
 
+        ahc.destroyAll();
     }
 }