I’m still going through the project, but the first couple of things that jump 
out at me are you have two Spring versions - the one you explicitly put in your 
POM (3.2.8.RELEASE) and the one pulled in by camel-spring (3.2.11.RELEASE).  
Also, camel-spring should be included in the POM since you’re using Spring 
routes.  I’m not sure if that’s enough to cause issues or not.

I believe what’s going on with the “no-tx” version is you’re actually using JMS 
transactions since you still have transacted set to true in the 
JmsConfiguration.

I’m not sure what’s going in with the “standard” version - it looks similar to 
some XA stuff I’ve setup before (because I had multiple brokers involved) 
except I had to use XA Connection Factories.  



> On Feb 3, 2016, at 3:12 PM, Stephan Burkard <sburk...@gmail.com> wrote:
> 
> Yes, same broker. There is only one ActiveMQ connection config in the
> project.
> 
> 
> 
> On Wed, Feb 3, 2016 at 8:00 PM, Quinn Stevenson <qu...@pronoia-solutions.com
>> wrote:
> 
>> Are both the source and destination queues hosted by the same ActiveMQ
>> broker?
>> 
>> 
>> 
>>> On Feb 3, 2016, at 8:21 AM, Stephan Burkard <sburk...@gmail.com> wrote:
>>> 
>>> Hi
>>> 
>>> I have built a small Maven project (attached) to demonstrate a JMS
>> transaction problem in Camel routes under certain load conditions. In fact
>> I am losing messages between two queues.
>>> 
>>> The project contains two different flavours of the same test. One of
>> them suffers from the problem, the other (due to my tests) not.
>>> 
>>> 
>>> *** What does the testcase?
>>> 1. Produces 1000 messages (100/s) and sends them to an "input" queue.
>>> 2. Sends the messages from the "input" queue to an "output" queue.
>>> 3. Finally consumes the messages from the "output" queue to count them.
>>> 
>>> 
>>> *** What is the difference between the two test flavours?
>>> - There is a "standard" flavour that suffers from the problem
>>> - And there is a "noTxManager" flavour that seems to not have the problem
>>> - The "standard" flavour is kind of a well known Camel/ActiveMQ
>> configuration
>>>  - with a Spring transaction manager
>>>  - with a Spring transaction policy
>>>  - With a "transacted" flag in Camel routes
>>> - The "noTxManager" flavour is a "simple" configuration
>>>  - no Spring transaction manager
>>>  - no Spring transaction policy
>>>  - no "transacted" flag in Camel routes
>>>  - BUT: "lazyCreateTransactionManager" = false (so routes are
>> transacted too)
>>> 
>>> 
>>> *** How to run the testcases?
>>> 1. Replace "[yourBrokerHost]" with the hostname of your ActiveMQ broker
>>> 2. Run the testcase as JUnit test
>>> 3. When you see lots of console messages that messages are sent, stop
>> your ActiveMQ broker (do not kill-9 it, just shut it down normally)
>>> 4. Exceptions are thrown on the console output
>>> 5. After some seconds start your broker again
>>> 6. The test finish normally and after some seconds dumps a book keeping
>> on the console
>>> 
>>> 
>>> *** How to interpret the results?
>>> - When the test is successful, no message is lost. You can run the test
>> without broker shutdown/startup and it will obviously always be successful.
>>> - When the test fails, one or more messages are lost between queue
>> "input" and "output". In my tests I was not able to run the "standard"
>> flavour three times in a row successfully. About every second run failed.
>> In contrast, the "noTxManager" flavour never failed in my tests.
>>> 
>>> The book keeping for a failed test looks like the following. In this
>> example Message number 281 is arrived at the input queue but not at the
>> output queue. So it is lost.
>>> 
>>> Messages created by Client:          1000
>>> Client Exceptions during send:       0 []
>>> 
>>> Messages received at input queue:    993
>>> Missing Messages at input queue:     7 [282,283,284,285,286,287,288]
>>> Duplicate Messages at input queue:   0 []
>>> 
>>> Messages received at output queue:   992
>>> Missing Messages at output queue:    8 [281,282,283,284,285,286,287,288]
>>> Duplicate Messages at output queue:  0 []
>>> 
>>> Lost Messages between Queues:        1 [281]
>>> 
>>> 
>>> *** What is the problem?
>>> A Redhat engineer tracked the problem down to a Spring JMS template
>> behaviour that is kind of strange. If a Spring transaction manager is
>> defined in the config, it will end up with two of them. Therefore the small
>> time range where messages can get lost that arises only when you have a
>> certain load.
>>> 
>>> 
>>> *** So, what is my question?
>>> - Does this really mean that it is unsafe to use the "standard" flavour
>> of configuration?
>>> - Is there another config with TxManager etc that works correctly?
>>> - What are limits of the "noTxManager" config? When is it not sufficent?
>>> 
>>> Regards
>>> Stephan
>>> 
>>> 
>>> 
>>> 
>>> <CamelAmqTxTest.zip>
>> 
>> 

Reply via email to