HTTP Post From ActiveMQ using Camel

2020-03-24 08:20发布

问题:

We're using camel routes to post values from a queue to an http endpoint.

I've successfully set up the route using camel's http component, but I'm unable to get the body of the jms message to post.

For example, my route is set up like this:

<route errorHandlerRef="dlc" autoStartup="true" id="route2" xmlns:ns2="http://camel.apache.org/schema/web" xmlns="http://camel.apache.org/schema/spring">
    <from uri="activemq:test"/>
    <setHeader headerName="CamelHttpMethod">
            <constant>POST</constant>
        </setHeader>
    <to uri="http://localhost/tim/camel/" id="to2"/>
</route>

Which results in a POST, but the message body does not show up in my POST string (as print_r'd from $_SERVER):

Array
(
    [instance] => local
    [HTTP_JMSDELIVERYMODE] => 1
    [HTTP_JMSDESTINATION] => queue://test
    [HTTP_JMSEXPIRATION] => 0
    [HTTP_JMSTYPE] => 
    [HTTP_JMSTIMESTAMP] => 1291468702773
    [HTTP_JMSPRIORITY] => 0
    [HTTP_JMSCORRELATIONID] => 
    [HTTP_JMSMESSAGEID] => ID:new-host-3.home-62248-1291465669089-4:3:1:1:4
    [HTTP_JMSREDELIVERED] => false
    [HTTP_USER_AGENT] => Jakarta Commons-HttpClient/3.1
    [HTTP_HOST] => localhost
    [HTTP_COOKIE] => $Version=0; PHPSESSID=32aa692c71e1003f2e540c1b80c3b363; $Path=/
    [CONTENT_LENGTH] => 44
    [CONTENT_TYPE] => text/html
    [PATH] => /usr/bin:/bin:/usr/sbin:/sbin
    [SERVER_SIGNATURE] => <address>Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2 mod_ssl/2.0.59 OpenSSL/0.9.7l Server at localhost Port 80</address>

    [SERVER_SOFTWARE] => Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2 mod_ssl/2.0.59 OpenSSL/0.9.7l
    [SERVER_NAME] => localhost
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => /wufoo/trunk/
    [SERVER_ADMIN] => you@example.com
    [SCRIPT_FILENAME] => /wufoo/trunk/tim/camel/index.php
    [REMOTE_PORT] => 62877
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => POST
    [QUERY_STRING] => 
    [REQUEST_URI] => /tim/camel/
    [SCRIPT_NAME] => /tim/camel/index.php
    [PHP_SELF] => /tim/camel/index.php
    [REQUEST_TIME] => 1291468702
    [argv] => Array
        (
        )

    [argc] => 0
)

Notice REQUEST_METHOD is POST, but argv does not contain a message body.

In short, I need to transfer the message body from the 'from' route to the 'to' route so it may be sent as a POST, but I'm failing somehow.

Thanks in advance.

回答1:

I found the answer. To fix, I had to add the Content Type node to the header and set the body to a name/value pair, as shown below:

<route errorHandlerRef="dlc" autoStartup="true" inheritErrorHandler="true" id="route2" xmlns:ns2="http://camel.apache.org/schema/web" xmlns="http://camel.apache.org/schema/spring">
    <from uri="activemq:test"/>
    <setBody inheritErrorHandler="true" id="setBody2">
        <simple>name=${body}</simple>
    </setBody>
    <setHeader headerName="Content-Type" inheritErrorHandler="true" id="setHeader3">
        <constant>application/x-www-form-urlencoded;</constant>
    </setHeader>
    <setHeader headerName="CamelHttpMethod" inheritErrorHandler="true" id="setHeader4">
        <constant>POST</constant>
    </setHeader>
    <to uri="http://localhost/tim/camel/" inheritErrorHandler="true" id="to2"/>
</route>