Author: davsclaus
Date: Mon Nov 30 11:27:40 2009
New Revision: 885380

URL: http://svn.apache.org/viewvc?rev=885380&view=rev
Log:
CAMEL-2238: Fixed Jetty HTTP producer in sync mode blocking if connection 
failure.

Added:
    
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerConnectionFailureTest.java
      - copied, changed from r885344, 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java
Modified:
    
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyContentExchange.java
    
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
    
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java

Modified: 
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyContentExchange.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyContentExchange.java?rev=885380&r1=885379&r2=885380&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyContentExchange.java
 (original)
+++ 
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyContentExchange.java
 Mon Nov 30 11:27:40 2009
@@ -21,6 +21,7 @@
 import java.io.UnsupportedEncodingException;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.concurrent.CountDownLatch;
 
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelExchangeException;
@@ -49,6 +50,7 @@
     private volatile AsyncCallback callback;
     private volatile JettyHttpBinding jettyBinding;
     private volatile HttpClient client;
+    private final CountDownLatch done = new CountDownLatch(1);
 
     public JettyContentExchange(Exchange exchange, JettyHttpBinding 
jettyBinding, HttpClient client) {
         super(true); // keep headers by default
@@ -77,23 +79,44 @@
     }
 
     @Override
-    protected void onResponseComplete() {
-        doTaskCompleted();
+    protected void onResponseComplete() throws IOException {
+        try {
+            super.onResponseComplete();
+        } finally {
+            doTaskCompleted();
+        }
     }
 
     @Override
     protected void onExpire() {
-        doTaskCompleted();
+        try {
+            super.onExpire();
+        } finally {
+            doTaskCompleted();
+        }
     }
 
     @Override
     protected void onException(Throwable ex) {
-        doTaskCompleted(ex);
+        try {
+            super.onException(ex);
+        } finally {
+            doTaskCompleted(ex);
+        }
     }
 
     @Override
     protected void onConnectionFailed(Throwable ex) {
-        doTaskCompleted(ex);
+        try {
+            super.onConnectionFailed(ex);
+        } finally {
+            doTaskCompleted(ex);
+        }
+    }
+
+    protected int waitForDoneOrFailure() throws InterruptedException {
+        done.await();
+        return getStatus();
     }
 
     public Map<String, String> getHeaders() {
@@ -110,6 +133,9 @@
     }
 
     protected void doTaskCompleted() {
+        // make sure to lower the latch
+        done.countDown();
+
         if (callback == null) {
             // this is only for the async callback
             return;
@@ -143,6 +169,9 @@
     }
 
     protected void doTaskCompleted(Throwable ex) {
+        // make sure to lower the latch
+        done.countDown();
+
         // some kind of other error
         exchange.setException(new CamelExchangeException("JettyClient failed 
cause by: " + ex.getMessage(), exchange, ex));
 

Modified: 
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java?rev=885380&r1=885379&r2=885380&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
 (original)
+++ 
camel/trunk/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/JettyHttpProducer.java
 Mon Nov 30 11:27:40 2009
@@ -88,8 +88,12 @@
     protected void sendSynchronous(Exchange exchange, HttpClient client, 
JettyContentExchange httpExchange) throws Exception {
         doSendExchange(client, httpExchange);
 
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Waiting for HTTP exchange to be done");
+        }
         // we send synchronous so wait for it to be done
-        int exchangeState = httpExchange.waitForDone();
+        // must use our own lock detection as Jettys waitForDone will wait 
forever in case of connection issues
+        int exchangeState = httpExchange.waitForDoneOrFailure();
         if (LOG.isTraceEnabled()) {
             LOG.trace("HTTP exchange is done with state " + exchangeState);
         }

Copied: 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerConnectionFailureTest.java
 (from r885344, 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerConnectionFailureTest.java?p2=camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerConnectionFailureTest.java&p1=camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java&r1=885344&r2=885380&rev=885380&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java
 (original)
+++ 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerConnectionFailureTest.java
 Mon Nov 30 11:27:40 2009
@@ -16,7 +16,10 @@
  */
 package org.apache.camel.component.jetty.jettyproducer;
 
-import org.apache.camel.Exchange;
+import java.net.ConnectException;
+
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.CamelExecutionException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
@@ -25,41 +28,25 @@
 /**
  * Unit test to verify that we can have URI options for external system 
(endpoint is lenient)
  */
-public class JettyHttpProducerGetWithParamAsExchangeHeaderTest extends 
CamelTestSupport {
+public class JettyHttpProducerConnectionFailureTest extends CamelTestSupport {
 
     private String serverUri = "jetty://http://localhost:9080/myservice";;
 
     @Test
     public void testHttpGetWithParamsViaURI() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedHeaderReceived("one", "einz");
-        mock.expectedHeaderReceived("two", "twei");
-        mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
-
-        template.requestBody(serverUri + "?one=einz&two=twei", null, 
Object.class);
-
-        assertMockEndpointsSatisfied();
-    }
-
-    @Test
-    public void testHttpGetWithParamsViaHeader() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedHeaderReceived("one", "uno");
-        mock.expectedHeaderReceived("two", "dos");
-        mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
-
-        template.requestBodyAndHeader(serverUri, null, Exchange.HTTP_QUERY, 
"one=uno&two=dos");
+        mock.expectedMessageCount(0);
 
-        assertMockEndpointsSatisfied();
-    }
-
-    @Test
-    public void testHttpPost() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedBodiesReceived("Hello World");
-        mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");
+        // give Jetty time to startup properly
+        Thread.sleep(1000);
 
-        template.requestBody(serverUri, "Hello World");
+        // use another port with no connection
+        try {
+            template.requestBody("jetty://http://localhost:9999/myservice";, 
null, Object.class);
+        } catch (CamelExecutionException e) {
+            CamelExchangeException cause = 
assertIsInstanceOf(CamelExchangeException.class, e.getCause());
+            assertIsInstanceOf(ConnectException.class, cause.getCause());
+        }
 
         assertMockEndpointsSatisfied();
     }

Modified: 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java?rev=885380&r1=885379&r2=885380&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java
 (original)
+++ 
camel/trunk/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/jettyproducer/JettyHttpProducerGetWithParamAsExchangeHeaderTest.java
 Mon Nov 30 11:27:40 2009
@@ -36,6 +36,9 @@
         mock.expectedHeaderReceived("two", "twei");
         mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
 
+        // give Jetty time to startup properly
+        Thread.sleep(1000);
+
         template.requestBody(serverUri + "?one=einz&two=twei", null, 
Object.class);
 
         assertMockEndpointsSatisfied();
@@ -48,6 +51,9 @@
         mock.expectedHeaderReceived("two", "dos");
         mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
 
+        // give Jetty time to startup properly
+        Thread.sleep(1000);
+
         template.requestBodyAndHeader(serverUri, null, Exchange.HTTP_QUERY, 
"one=uno&two=dos");
 
         assertMockEndpointsSatisfied();
@@ -59,6 +65,9 @@
         mock.expectedBodiesReceived("Hello World");
         mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");
 
+        // give Jetty time to startup properly
+        Thread.sleep(1000);
+
         template.requestBody(serverUri, "Hello World");
 
         assertMockEndpointsSatisfied();


Reply via email to