You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "NNZZ (JIRA)" <ji...@apache.org> on 2008/12/11 16:49:05 UTC

[jira] Created: (AMQNET-133) Consumers cannot be stopped without causing error for messages that are already in process

Consumers cannot be stopped without causing error for messages that are already in process
------------------------------------------------------------------------------------------

                 Key: AMQNET-133
                 URL: https://issues.apache.org/activemq/browse/AMQNET-133
             Project: ActiveMQ .Net
          Issue Type: Bug
    Affects Versions: 1.2
         Environment: ActiveMQ message Consumers
            Reporter: NNZZ
            Assignee: Jim Gomes


I do not see any way to stop listeners from accepting new messages BUT let them finish processing messages that are already in process (like drain stop in IIS). And also a way to start them back so new messages will be processed as normal AND also pending messages, that were sent while the listeners were 'blocked', will be processed as well.

I am using spring.Net and when I tried Spring.Context.Support.ContextRegistry.Clear() and SimpleMessageListenerContainer.Stop() but both methods caused failure for messages that were already in process by the consumers (Thread aborted method) - It seems like those methods just stopped the consumer completely. 

Since I could not  find anything that worked, I also tried changing the message selector directly on the consumers (using JMX) to a false expression (like 1>1) , and that did stop any new messages without interfering the processing of existing ones, but I couldn't then 'turn the consumers back on'. When I changed the selector to a true expression (like 1=1), I could not resend the pending messages, that where sent while the selector was false. I tried to resend them by getting the pending messages Ids (which I got from JVM) and then invoke the retryMessage message of org.apache.activemq.broker.region.Queue (got that object from JVM\JMx as well). However when I did so I got the following error:

javax.jms.JMSException: No original destination for message: 05d79c66-be01-4db1-adc6-73384475a6f9:1:1:1

Would you be able to advise whether there a way to stop listeners without aborting the thread and then start them again so that pending messages will be consumed? and if not would that be possible to add such functionality? It is required when updating our service (the exe files) that is using ActiveMQ.

Many thanks

N


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (AMQNET-133) Consumers cannot be stopped without causing error for messages that are already in process

Posted by "Jim Gomes (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/activemq/browse/AMQNET-133?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jim Gomes resolved AMQNET-133.
------------------------------

    Resolution: Fixed

Marking this item as Fixed, as I believe it was a Spring.NET issue, and it has been resolved in that library.  Please reopen if this is not the case.

> Consumers cannot be stopped without causing error for messages that are already in process
> ------------------------------------------------------------------------------------------
>
>                 Key: AMQNET-133
>                 URL: https://issues.apache.org/activemq/browse/AMQNET-133
>             Project: ActiveMQ .Net
>          Issue Type: Bug
>    Affects Versions: 1.2
>         Environment: ActiveMQ message Consumers
>            Reporter: NNZZ
>            Assignee: Jim Gomes
>
> I do not see any way to stop listeners from accepting new messages BUT let them finish processing messages that are already in process (like drain stop in IIS). And also a way to start them back so new messages will be processed as normal AND also pending messages, that were sent while the listeners were 'blocked', will be processed as well.
> I am using spring.Net and when I tried Spring.Context.Support.ContextRegistry.Clear() and SimpleMessageListenerContainer.Stop() but both methods caused failure for messages that were already in process by the consumers (Thread aborted method) - It seems like those methods just stopped the consumer completely. 
> Since I could not  find anything that worked, I also tried changing the message selector directly on the consumers (using JMX) to a false expression (like 1>1) , and that did stop any new messages without interfering the processing of existing ones, but I couldn't then 'turn the consumers back on'. When I changed the selector to a true expression (like 1=1), I could not resend the pending messages, that where sent while the selector was false. I tried to resend them by getting the pending messages Ids (which I got from JVM) and then invoke the retryMessage message of org.apache.activemq.broker.region.Queue (got that object from JVM\JMx as well). However when I did so I got the following error:
> javax.jms.JMSException: No original destination for message: 05d79c66-be01-4db1-adc6-73384475a6f9:1:1:1
> Would you be able to advise whether there a way to stop listeners without aborting the thread and then start them again so that pending messages will be consumed? and if not would that be possible to add such functionality? It is required when updating our service (the exe files) that is using ActiveMQ.
> Many thanks
> N

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.