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.
