[
https://issues.apache.org/jira/browse/AMQ-4107?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13850427#comment-13850427
]
Nikolay Martynov commented on AMQ-4107:
---------------------------------------
Problem reproduces on 5.9.
> Message order can be broken for Topic under a high load when topicPrefetch=1
> and comsumer is slow
> -------------------------------------------------------------------------------------------------
>
> Key: AMQ-4107
> URL: https://issues.apache.org/jira/browse/AMQ-4107
> Project: ActiveMQ
> Issue Type: Bug
> Components: Transport
> Affects Versions: 5.6.0
> Reporter: Yuriy Sidelnikov
> Attachments: 4107.diff
>
>
> For <amq:policyEntry topic=">" producerFlowControl="true" memoryLimit="30mb"
> {color:red}topicPrefetch="1"{color} blockedProducerWarningInterval="30">
> Short excerpt from TopicSubscription class:
> public void add(MessageReference node) throws Exception {
> …..
> if ({color:red}!isFull(){color} && matched.isEmpty() &&
> !isSlave()) {
> // if maximumPendingMessages is set we will only discard messages
> which
> // have not been dispatched (i.e. we allow the prefetch buffer to
> be filled)
> {color:red}dispatch(node);{color} <- Second message
> will go this way and might be dispatched sooner than first one.
> setSlowConsumer(false);
> } else {
> …….
> if ({color:red}matched.tryAddMessageLast(node, 10)){color} { <- first
> message will be put in the VMCursor queue and might be dispatched later
>
> break;
> }
> .....
> {color:red}dispatchMatched();{color} <- First message won't be dispatched
> immediately because !isFull() is still false
> }
> Possible scenario as I can see it from logs:
> 1. First message has arrived and !isFull() is false because consumer didn't
> take some previous message yet.
> 2. First message will be processed by tryAddMessageLast in
> VMPendingMessageCursor class and will be dispatched very lately because
> !isFull() is still false.
> 3. Meanwhile consumer reads some previous message and !isFull() will return
> true.
> 4. Second message will be dispatched immediately and might be first to be
> delivered.
> 5. Then first message is dispatched.
> 6. Message order is broken.
--
This message was sent by Atlassian JIRA
(v6.1.4#6159)