[
https://issues.apache.org/jira/browse/AMQ-6658?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16026736#comment-16026736
]
clebert suconic commented on AMQ-6658:
--------------------------------------
Ahaa..... I told you it was about prefetch... just saw your message after I
answered you on the user's list.
I will close this is a not a bug.. this is definitely not a bug... if you
disable prefetch for everybody.. then there's no way to make everybody happy.
With ActiveMQ Artemis I believe we empty the buffer after redeliver.. so
perhaps it's not an issue there.
> 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)