You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2010/11/25 22:30:34 UTC

svn commit: r1039190 - in /httpcomponents/httpasyncclient/trunk/src: examples/org/apache/http/examples/nio/client/ main/java/org/apache/http/impl/nio/client/ test/java/org/apache/http/impl/nio/client/

Author: olegk
Date: Thu Nov 25 21:30:33 2010
New Revision: 1039190

URL: http://svn.apache.org/viewvc?rev=1039190&view=rev
Log:
Improved exception handling

Modified:
    httpcomponents/httpasyncclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java
    httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java
    httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java
    httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java
    httpcomponents/httpasyncclient/trunk/src/test/java/org/apache/http/impl/nio/client/TestHttpAsync.java

Modified: httpcomponents/httpasyncclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java?rev=1039190&r1=1039189&r2=1039190&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/examples/org/apache/http/examples/nio/client/AsyncClientRequest.java Thu Nov 25 21:30:33 2010
@@ -57,29 +57,28 @@ public class AsyncClientRequest {
         sessmrg.setTotalMax(5);
         sessmrg.setDefaultMaxPerHost(3);
 
-        HttpAsyncClient asynchttpclient = new BasicHttpAsyncClient(
+        HttpAsyncClient httpclient = new BasicHttpAsyncClient(
                 ioReactor,
                 sessmrg,
                 params);
 
-        asynchttpclient.start();
+        httpclient.start();
         try {
             HttpHost target = new HttpHost("www.apache.org", 80);
             Queue<Future<HttpResponse>> queue = new LinkedList<Future<HttpResponse>>();
             for (int i = 0; i < 10; i++) {
                 BasicHttpRequest request = new BasicHttpRequest("GET", "/");
-                queue.add(asynchttpclient.execute(target, request, null));
+                queue.add(httpclient.execute(target, request, null));
             }
             while (!queue.isEmpty()) {
                 Future<HttpResponse> future = queue.remove();
                 HttpResponse response = future.get();
                 System.out.println("Response: " + response.getStatusLine());
-
             }
 
             System.out.println("Shutting down");
         } finally {
-            asynchttpclient.shutdown();
+            httpclient.shutdown();
         }
         System.out.println("Done");
     }

Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java?rev=1039190&r1=1039189&r2=1039190&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/BasicHttpAsyncExchangeHandler.java Thu Nov 25 21:30:33 2010
@@ -153,10 +153,8 @@ public class BasicHttpAsyncExchangeHandl
             } catch (IOException ex) {
             }
         }
-        this.response = null;
     }
 
-
     public void cancelled() {
         shutdown();
     }

Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java?rev=1039190&r1=1039189&r2=1039190&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/HttpAsyncExchange.java Thu Nov 25 21:30:33 2010
@@ -89,6 +89,7 @@ class HttpAsyncExchange<T> {
             }
             this.managedSession = null;
             this.handler.cancelled();
+            this.resultFuture.cancel(true);
         } catch (RuntimeException runex) {
             this.resultFuture.failed(runex);
             throw runex;
@@ -103,6 +104,7 @@ class HttpAsyncExchange<T> {
             }
             this.managedSession = null;
             this.handler.failed(ex);
+            this.resultFuture.failed(ex);
         } catch (RuntimeException runex) {
             this.resultFuture.failed(ex);
             throw runex;

Modified: httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java?rev=1039190&r1=1039189&r2=1039190&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/main/java/org/apache/http/impl/nio/client/NHttpClientProtocolHandler.java Thu Nov 25 21:30:33 2010
@@ -127,7 +127,6 @@ class NHttpClientProtocolHandler impleme
             this.log.debug("Disconnected " + formatState(conn, connState));
         }
         if (connState != null) {
-            connState.reset();
             HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
             if (httpexchange != null) {
                 httpexchange.shutdown();
@@ -212,11 +211,11 @@ class NHttpClientProtocolHandler impleme
         } catch (IOException ex) {
             this.log.error("I/O error: " + ex.getMessage(), ex);
             shutdownConnection(conn);
-            handler.failed(ex);
+            httpexchange.failed(ex);
         } catch (HttpException ex) {
             this.log.error("HTTP protocol exception: " + ex.getMessage(), ex);
             closeConnection(conn);
-            handler.failed(ex);
+            httpexchange.failed(ex);
         }
     }
 
@@ -226,7 +225,8 @@ class NHttpClientProtocolHandler impleme
         if (this.log.isDebugEnabled()) {
             this.log.debug("Input ready " + formatState(conn, connState));
         }
-        HttpAsyncExchangeHandler<?> handler = connState.getHttpExchange().getHandler();
+        HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
+        HttpAsyncExchangeHandler<?> handler = httpexchange.getHandler();
         try {
             handler.consumeContent(decoder, conn);
             if (decoder.isCompleted()) {
@@ -235,7 +235,7 @@ class NHttpClientProtocolHandler impleme
         } catch (IOException ex) {
             this.log.error("I/O error: " + ex.getMessage(), ex);
             shutdownConnection(conn);
-            handler.failed(ex);
+            httpexchange.failed(ex);
         }
     }
 
@@ -245,7 +245,8 @@ class NHttpClientProtocolHandler impleme
         if (this.log.isDebugEnabled()) {
             this.log.debug("Output ready " + formatState(conn, connState));
         }
-        HttpAsyncExchangeHandler<?> handler = connState.getHttpExchange().getHandler();
+        HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
+        HttpAsyncExchangeHandler<?> handler = httpexchange.getHandler();
         try {
             if (connState.getRequestState() == MessageState.ACK) {
                 conn.suspendOutput();
@@ -258,7 +259,7 @@ class NHttpClientProtocolHandler impleme
         } catch (IOException ex) {
             this.log.error("I/O error: " + ex.getMessage(), ex);
             shutdownConnection(conn);
-            handler.failed(ex);
+            httpexchange.failed(ex);
         }
     }
 
@@ -268,7 +269,8 @@ class NHttpClientProtocolHandler impleme
         if (this.log.isDebugEnabled()) {
             this.log.debug("Response received " + formatState(conn, connState));
         }
-        HttpAsyncExchangeHandler<?> handler = connState.getHttpExchange().getHandler();
+        HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
+        HttpAsyncExchangeHandler<?> handler = httpexchange.getHandler();
         try {
             HttpResponse response = conn.getHttpResponse();
             response.setParams(new DefaultedHttpParams(response.getParams(), this.params));
@@ -310,11 +312,11 @@ class NHttpClientProtocolHandler impleme
         } catch (IOException ex) {
             this.log.error("I/O error: " + ex.getMessage(), ex);
             shutdownConnection(conn);
-            handler.failed(ex);
+            httpexchange.failed(ex);
         } catch (HttpException ex) {
             this.log.error("HTTP protocol exception: " + ex.getMessage(), ex);
             closeConnection(conn);
-            handler.failed(ex);
+            httpexchange.failed(ex);
         }
     }
 
@@ -324,7 +326,7 @@ class NHttpClientProtocolHandler impleme
         if (this.log.isDebugEnabled()) {
             this.log.debug("Timeout " + formatState(conn, connState));
         }
-        HttpAsyncExchangeHandler<?> handler = connState.getHttpExchange().getHandler();
+        HttpAsyncExchange<?> httpexchange = connState.getHttpExchange();
         try {
             if (connState.getRequestState() == MessageState.ACK) {
                 continueRequest(conn, connState);
@@ -344,7 +346,7 @@ class NHttpClientProtocolHandler impleme
         } catch (IOException ex) {
             this.log.error("I/O error: " + ex.getMessage(), ex);
             shutdownConnection(conn);
-            handler.failed(ex);
+            httpexchange.failed(ex);
         }
     }
 

Modified: httpcomponents/httpasyncclient/trunk/src/test/java/org/apache/http/impl/nio/client/TestHttpAsync.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpasyncclient/trunk/src/test/java/org/apache/http/impl/nio/client/TestHttpAsync.java?rev=1039190&r1=1039189&r2=1039190&view=diff
==============================================================================
--- httpcomponents/httpasyncclient/trunk/src/test/java/org/apache/http/impl/nio/client/TestHttpAsync.java (original)
+++ httpcomponents/httpasyncclient/trunk/src/test/java/org/apache/http/impl/nio/client/TestHttpAsync.java Thu Nov 25 21:30:33 2010
@@ -1,8 +1,10 @@
 package org.apache.http.impl.nio.client;
 
+import java.io.IOException;
 import java.util.LinkedList;
 import java.util.Queue;
 import java.util.Random;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
 import org.apache.http.HttpEntity;
@@ -13,6 +15,8 @@ import org.apache.http.client.methods.Ht
 import org.apache.http.impl.nio.conn.BasicIOSessionManager;
 import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
 import org.apache.http.localserver.ServerTestBase;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.IOControl;
 import org.apache.http.nio.client.HttpAsyncClient;
 import org.apache.http.nio.entity.NByteArrayEntity;
 import org.apache.http.nio.reactor.ConnectingIOReactor;
@@ -141,4 +145,38 @@ public class TestHttpAsync extends Serve
         }
     }
 
+    @Test
+    public void testMultipleRequestFailures() throws Exception {
+        this.httpclient.start();
+
+        Queue<Future<HttpResponse>> queue = new LinkedList<Future<HttpResponse>>();
+
+        for (int i = 0; i < 3; i++) {
+            HttpGet httpget = new HttpGet("/random/2048");
+            BasicHttpAsyncExchangeHandler kaboom = new BasicHttpAsyncExchangeHandler(this.target, httpget) {
+
+                @Override
+                public void consumeContent(final ContentDecoder decoder, final IOControl ioctrl)
+                        throws IOException {
+                    throw new IOException("Kaboom");
+                }
+
+            };
+            queue.add(this.httpclient.execute(kaboom, null));
+        }
+
+        while (!queue.isEmpty()) {
+            Future<HttpResponse> future = queue.remove();
+            try {
+                future.get();
+                Assert.fail("ExecutionException expected");
+            } catch (ExecutionException ex) {
+                Throwable t = ex.getCause();
+                Assert.assertNotNull(t);
+                Assert.assertTrue(t instanceof IOException);
+                Assert.assertEquals("Kaboom", t.getMessage());
+            }
+        }
+    }
+
 }