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