activemq-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "clebert suconic (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (AMQ-6658) Messenger does not respect order after redelivery
Date Fri, 26 May 2017 19:42:04 GMT

    [ 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)

Mime
View raw message