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

Claus Ibsen resolved CAMEL-8199.
--------------------------------
    Resolution: Duplicate

Duplicate of CAMEL-8200

> Race condition in JmsProducer for request/response messaging causing 
> nondeterministic setting body to null.
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-8199
>                 URL: https://issues.apache.org/jira/browse/CAMEL-8199
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-jms
>    Affects Versions: 2.14.0
>            Reporter: Krzysztof Mackowiak
>
> In my team we have noticed that there is a race condition problem in 
> JmsProducer class for request/response messaging. It causes that sometimes 
> (nondeterministically) body of a response message is changed to null. It can 
> happen when JMS response is received very fast (we use in-memory ActiveMQ 
> with VM transport and no persistence) under heavy load.
> It looks that there is a problem in JmsProducer class in 
> processInOut(exchange, callback) method.
> {code}
>     protected boolean processInOut(final Exchange exchange, final 
> AsyncCallback callback) {
>         …
>         doSend(true, destinationName, destination, messageCreator, 
> messageSentCallback);
>         // after sending then set the OUT message id to the JMSMessageID so 
> its identical
>         setMessageId(exchange);
>         // continue routing asynchronously (reply will be processed async 
> when its received)
>         return false;
>     }
> ...
>     protected void setMessageId(Exchange exchange) {
>         if (exchange.hasOut()) {
>             JmsMessage out = exchange.getOut(JmsMessage.class);
>             try {
>                 if (out != null && out.getJmsMessage() != null) {
>                     out.setMessageId(out.getJmsMessage().getJMSMessageID());
>                 }
>             } catch (JMSException e) {
>                 LOG.warn("Unable to retrieve JMSMessageID from outgoing JMS 
> Message and set it into Camel's MessageId", e);
>             }
>         }
>     }
> {code}
> The problem is caused by invoking setMessageId(...) method after doSend(...). 
> Method doSend(...) is sending JMS request message and causes that another 
> thread is used to handle JMS reply message. This leads to a situation that 2 
> different threads can operate on the same exchange (which is not synchronized 
> at all) at the same time:
> 1) original thread in which processInOut(...) method was called,
> 2) separate thread from JMS component for handling JMS response.
> In our case there it was happening sometimes that setMessageId(...) was 
> invoked at the same time as PipelineHelper.createNextMessage(exchange) method:
> {code}
>     public static Exchange createNextExchange(Exchange previousExchange) {
>         Exchange answer = previousExchange;
>         // now lets set the input of the next exchange to the output of the
>         // previous message if it is not null
>         if (answer.hasOut()) {
>             answer.setIn(answer.getOut());
>             answer.setOut(null);
>         }
>         return answer;
>     }
> {code}
> It caused that body of response message was lost (set to null).
> It looks for me that calling setMessageId(...) at the end of 
> processInOut(...) method is redundant and this logic should be executed when 
> JMS reply message is handled.
> I've attached a patch where invokation of setMessageId(...) is removed.
> I've checked that it doesn't break any test for camel-jms component.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to