Fabian González created AMQ-6658:
------------------------------------
Summary: Messenger does not respect order after redelivery
Key: AMQ-6658
URL: https://issues.apache.org/jira/browse/AMQ-6658
Project: ActiveMQ
Issue Type: Bug
Affects Versions: 5.14.3
Reporter: Fabian González
I am facing a situation where activemq seems not to respect the order for
dispatched messages when a redilevery is needed using activemq-client 5.14.3.
I am sending 60 messages to a queue with a single consumer, and I've noticed
that sometimes when a relivery of the message is needed, as a consequence of
rollback, another message from those 60 message is served before the
redelivered message. There is no maxRedelivery set.
What I notice debugging ActiveMQMessageConsumer is that the following behaviour
may occur:
- The 60 messages are dispatched in order in:
ActiveMQMessageConsumer:1376:
@Override
public void dispatch(MessageDispatch md) {
MessageListener listener = this.messageListener.get();
try {
clearMessagesInProgress();
...
unconsumedMessage is running so the message is sent to the listener.
- a rollback is performed and the message is redelivered (with a default delay):
ActiveMQMessageConsumer:1305:
if (redeliveryDelay > 0 &&
!unconsumedMessages.isClosed()) {
// Start up the delivery again a little later.
session.getScheduler().executeAfterDelay(new
Runnable() {
@Override
public void run() {
try {
if (started.get()) {
start();
}
} catch (JMSException e) {
session.connection.onAsyncException(e);
}
}
}, redeliveryDelay);
} else {
start();
}
Periodically, the messages enqueued in the session are attempted to be consumed
(as the unconsumedMessages from the consumer is not running they are not sent
to the listener to be consumed and they are enqueued as unconsumedMessages).
But if the thread scheduled from redelivery is started when the iteration from
the unconsumed messages is being performed, the unconsumedMessages is started
in:
public void start() throws JMSException {
if (unconsumedMessages.isClosed()) {
return;
}
started.set(true);
unconsumedMessages.start();
session.executor.wakeup();
}
and the message that is being considered from session (in the other thread) is
sent to the listener before the redelivered message, which may be an error in
order.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)