Author: davsclaus Date: Thu Apr 14 22:05:05 2011 New Revision: 1092531 URL: http://svn.apache.org/viewvc?rev=1092531&view=rev Log: CAMEL-2194: camel-restlet producer leverages asynchronous routing engine
Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java Modified: camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java?rev=1092531&r1=1092530&r2=1092531&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java (original) +++ camel/trunk/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletProducer.java Thu Apr 14 22:05:05 2011 @@ -21,13 +21,15 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.camel.AsyncCallback; import org.apache.camel.CamelExchangeException; import org.apache.camel.Exchange; -import org.apache.camel.impl.DefaultProducer; +import org.apache.camel.impl.DefaultAsyncProducer; import org.restlet.Client; import org.restlet.Context; import org.restlet.Request; import org.restlet.Response; +import org.restlet.Uniform; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +38,7 @@ import org.slf4j.LoggerFactory; * * @version */ -public class RestletProducer extends DefaultProducer { +public class RestletProducer extends DefaultAsyncProducer { private static final Logger LOG = LoggerFactory.getLogger(RestletProducer.class); private static final Pattern PATTERN = Pattern.compile("\\{([\\w\\.]*)\\}"); private Client client; @@ -61,29 +63,46 @@ public class RestletProducer extends Def super.doStop(); } - public void process(Exchange exchange) throws Exception { + @Override + public boolean process(final Exchange exchange, final AsyncCallback callback) { RestletEndpoint endpoint = (RestletEndpoint) getEndpoint(); - String resourceUri = buildUri(endpoint, exchange); - Request request = new Request(endpoint.getRestletMethod(), resourceUri); - - RestletBinding binding = endpoint.getRestletBinding(); - binding.populateRestletRequestFromExchange(request, exchange); - - if (LOG.isDebugEnabled()) { - LOG.debug("Client sends a request (method: " + request.getMethod() + ", uri: " + resourceUri + ")"); - } - - Response response = client.handle(request); - if (throwException) { - if (response != null) { - Integer respCode = response.getStatus().getCode(); - if (respCode > 207) { - throw populateRestletProducerException(exchange, response, respCode); + final RestletBinding binding = endpoint.getRestletBinding(); + Request request; + try { + String resourceUri = buildUri(endpoint, exchange); + request = new Request(endpoint.getRestletMethod(), resourceUri); + binding.populateRestletRequestFromExchange(request, exchange); + } catch (CamelExchangeException e) { + // break out in case of exception + exchange.setException(e); + callback.done(true); + return true; + } + + // process the request asynchronously + LOG.debug("Sending request: {} for exchangeId: {}", request, exchange.getExchangeId()); + client.handle(request, new Uniform() { + @Override + public void handle(Request request, Response response) { + LOG.debug("Received response: {} for exchangeId: {}", response, exchange.getExchangeId()); + try { + if (response != null) { + Integer respCode = response.getStatus().getCode(); + if (respCode > 207 && throwException) { + exchange.setException(populateRestletProducerException(exchange, response, respCode)); + } else { + binding.populateExchangeFromRestletResponse(exchange, response); + } + } + } catch (Exception e) { + exchange.setException(e); } + callback.done(false); } - } - binding.populateExchangeFromRestletResponse(exchange, response); + }); + + return false; } private static String buildUri(RestletEndpoint endpoint, Exchange exchange) throws CamelExchangeException { @@ -116,15 +135,11 @@ public class RestletProducer extends Def } uri = addQueryToUri(uri, query); } - - if (LOG.isDebugEnabled()) { - LOG.debug("Using uri: " + uri); - } + LOG.trace("Using uri: {}", uri); return uri; } - protected static String addQueryToUri(String uri, String query) { if (uri == null || uri.length() == 0) { return uri; @@ -139,7 +154,7 @@ public class RestletProducer extends Def answer.append(query); } else { answer.append(uri.substring(0, index)); - answer.append("?"); + answer.append("?"); answer.append(query); String remaining = uri.substring(index + 1); if (remaining.length() > 0) { @@ -148,7 +163,7 @@ public class RestletProducer extends Def } } return answer.toString(); - + } protected RestletOperationException populateRestletProducerException(Exchange exchange, Response response, int responseCode) { Modified: camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java?rev=1092531&r1=1092530&r2=1092531&view=diff ============================================================================== --- camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java (original) +++ camel/trunk/components/camel-restlet/src/test/java/org/apache/camel/component/restlet/RestletProducerGetTest.java Thu Apr 14 22:05:05 2011 @@ -38,7 +38,7 @@ public class RestletProducerGetTest exte return new RouteBuilder() { @Override public void configure() throws Exception { - from("direct:start").to("restlet:http://localhost:9080/users/123/basic"); + from("direct:start").to("restlet:http://localhost:9080/users/123/basic").to("log:reply"); from("restlet:http://localhost:9080/users/{id}/basic") .process(new Processor() {