Hi all,

I think there is a bug in camel-restlet, but I'd like to pass it by you
first and see what you think...


I define a route with a restlet consumer and http producer:
<route>
  <from uri="restlet:http://localhost:9090/proxy?restletMethod=POST"/>
  ...
  <setHeader headerName="CamelHttpMethod">
    <constant>POST</constant>
  </setHeader>
  <setHeader headerName="Content-Type">
    <constant>text/xml</constant>
  </setHeader>
  <to uri="http://localhost:8080/server"/>
</route>


I deploy this route in Tomcat, and the logs indicate that it has
connected to both endpoints:
HttpClient DEBUG Java version: 1.6.0_23
....
HttpProducer DEBUG Starting producer:
Producer[http://localhost:8080/server]
....
RestletConsumer DEBUG Starting consumer:
Consumer[http://localhost:9090/proxy]
RestletComponent DEBUG Added server: localhost:9090
....
DefaultCamelContext INFO  Apache Camel 2.4.0 started in 1.001 seconds


The restlet consumer accepts a message on port 8080:
MethodBasedRouter DEBUG MethodRouter (/proxy) received request method:
POST
RestletConsumer DEBUG Consumer restlet handle request method: POST
....


The send processor opens a connection to port 9090 (or so it says):
SendProcessor DEBUG >>>> Endpoint[http://localhost:9090/server]
....


But then things go a bit funny - the http producer opens a connection to
port 8080, and sends the message back into the restlet consumer!
HttpProducer DEBUG Executing http POST method:
http://localhost:8080/proxy
iThreadedHttpConnectionManager DEBUG
HttpConnectionManager.getConnection: config =
HostConfiguration[host=http://localhost:9090], timeout = 0
iThreadedHttpConnectionManager DEBUG Allocating new connection,
hostConfig=HostConfiguration[host=http://localhost:9090]
HttpConnection DEBUG Open connection to localhost:9090
....


The message is now stuck, having been fed from the route's http producer
back into its restlet consumer.

My guess is that the camel-restlet component configures a http
producer's connection URI, and the same http producer is recycled for
use in the camel-http component.

If this is correct, then I would suggest one of these solutions:
(1) the camel-restlet and camel-http components should each create their
own unique instance of HttpProducer and HttpConsumer
(2) the camel-restlet and camel-http components should continue to share
HttpProducer and HttpConsumer instances, but only after checking that
the endpoint URI is correct
(3) HttpProducer and HttpConsumer should be made 'smart', i.e. they
should ask their parent for an endpoint URI when invoked, compare this
URI to the current connection, and if a mismatch is found, update the
current connection by calling HttpConnectionManager.getConnection()

Opinions? Thoughts? Questions?

As for workarounds, my http producer is actually invoking a RESTful
service, so I was able to fix the problem simply by using a restlet
producer instead. But the restlet-consumer-to-http-producer is a valid
routing scenario, so the problem still needs fixing ... doesn't it?

Kind Regards,

Paul


STRICTLY PRIVATE, CONFIDENTIAL AND PRIVILEGED COMMUNICATION.

This message (including attachments) may contain information that is
privileged, confidential or protected from disclosure. They are intended
solely for the use of the intended recipient. If you are not the
intended recipient, you are hereby notified that dissemination,
disclosure, copying, distribution, printing, transmission or use of this
message or any information contained in it is strictly prohibited. If
you have received this message from NewBay Software in error, please
immediately notify the sender by reply email and delete this message
from your computer. The content of this e-mail, and any files
transmitted with it, may have been changed or altered without the
consent of the author. Although we have taken steps to ensure that this
email and attachments are free from any virus, we advise that in keeping
with good computing practice the recipient should ensure they are
actually virus free.

Reply via email to