[ 
https://issues.apache.org/jira/browse/CAMEL-5390?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on CAMEL-5390 started by Raul Kripalani.

> 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
>
> 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="true">
>                 <tokenize token="," />
>                 <inOut uri="activemq:queue:test2" />
>             </split> 
>             <to uri="log:Finished?showAll=true" />
>         </route>
>         
>         <route>
>             <from uri="activemq:queue:test1" />
>             <to uri="log:Received?showAll=true" />
>         </route>
>  
>          <route>
>             <from uri="activemq:queue:test2" />
>             <to uri="log:Received?showAll=true" />
>             <setBody><constant>reply</constant></setBody>
>             <delay><constant>100</constant></delay>
>         </route>
> {code}
> There are several solutions here:
> # Remove the JMSCorrelationID header before each request to test2
> # Enable the useMessageIDAsCorrelationID option on both producer and consumer 
> endpoints
> # 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 this is inefficient 
> and flaky for enterprise deployments.
> 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
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to