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