Raul Kripalani created CAMEL-5390:
-------------------------------------

             Summary: Option to assign unique correlation ID to JMS messages
                 Key: CAMEL-5390
                 URL: https://issues.apache.org/jira/browse/CAMEL-5390
             Project: Camel
          Issue Type: Improvement
          Components: camel-activemq
    Affects Versions: 2.10.0
            Reporter: Raul Kripalani
            Assignee: Raul Kripalani
             Fix For: 2.10.1


Imagine a sequential JMS invocation across Camel routes, such as the following:

{code}
<route>
    <from uri="timer:foo?fixedRate=true&amp;period=10000" />
    <inOut uri="activemq:queue:test1" />
    <inOut uri="activemq:queue:test2" />
</route>
{code}

The camel-jms consumer listening on test1 will set the JMSCorrelationID header 
to the JMSMessageID for that exchange.

When the response returns to the route and sent to test2, this consumer also 
uses the *same* JMSCorrelationID as before.

IMHO, this behaviour is incorrect from the pragmatic perspective. Why should 
test2 reuse the Message ID from test1 after all?

Despite that, the correlation works for simple cases, but for complex routing 
with parallel JMS exchanges, it doesn't because the correlation ID is not 
unique for each exchange. Consider the following splitter:

{code}
<route>
            <from uri="timer:foo?fixedRate=true&amp;period=10000" />
            <setBody><constant>1,2,3,4,5</constant></setBody>
            <inOut uri="activemq:queue:test1" />
            <split parallelProcessing="false">
                <tokenize token="," />
                <inOut uri="activemq:queue:test2" />
            </split> 
            <to uri="log:Finished?showAll=true" />
        </route>
{code}

There are several solutions here:

#. Remove the JMSCorrelationID header before each request to test2
#. Enable the useMessageIDAsCorrelationID option to true on both producer and 
consumer
#. Create a new option to assign a unique ID to the JMSCorrelationID header

The downside of 2 is that the message ID is only assigned after the JMS 
dispatch, so the component updates the correlation map with the final 
JMSMessageID after the JMS dispatch. Also, camel-jms is also prepared to handle 
cases where the reply comes in before the map update has occurred, by waiting 5 
seconds if an unknown correlation ID is received, blocking the receipt of any 
further replies. You will agree with me it is not efficient at all.

That's where the upside of 3 lies. By expressly setting a static unique ID as 
the correlation ID, we get rid of these race conditions and inefficiencies.

I propose calling this option 'assignUniqueCorrelationID'.

I'm happy to submit a patch for this, targeting 2.10.1.


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to