[ 
https://issues.apache.org/activemq/browse/AMQNET-154?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=50903#action_50903
 ] 

Timothy Bish commented on AMQNET-154:
-------------------------------------

This looks to be a simple bug in the Dispatcher used by consumers, the close 
method looks as follows:

{noformat}
                public void Close()
                {
                        lock (semaphore)
                        {
                                m_bClosed = true;
                                queue.Clear();
                                if(m_bAsyncDelivery)
                                {
                                        messageReceivedEventHandle.Set();
                                }
                        }
                }
{noformat}

I think the if statement there should be:

{noformat}
                if(!m_bAsyncDelivery)
                {
                        messageReceivedEventHandle.Set();
                }
{noformat}

Since the async delivery case only needs to trigger an event when a message 
arrives whereas the sync delivery case needs to trigger a wakeup on close for 
any waiting consumers.

> Closing a consumer does not unblock receive call
> ------------------------------------------------
>
>                 Key: AMQNET-154
>                 URL: https://issues.apache.org/activemq/browse/AMQNET-154
>             Project: ActiveMQ .Net
>          Issue Type: Bug
>          Components: ActiveMQ Client
>    Affects Versions: 1.1
>         Environment: windows xp profesional
>            Reporter: Marco Crivellaro
>            Assignee: Jim Gomes
>
> calling the close method of a cosumer while this has a pending receive call 
> blocked does not unblock returning null.
> sample code (C#)
> using System;
> using Apache.NMS;
> using Apache.NMS.ActiveMQ;
> using System.Threading;
> namespace simpleConsumer
> {
>     class Program
>     {
>         private static bool _exit = false;
>         private static IMessageConsumer _consumer;
>        
>         static void Main(string[] args)
>         {            
>             Apache.NMS.ActiveMQ.ConnectionFactory connectionFactory = new 
> ConnectionFactory("tcp://172.18.141.102:61616");
>             Apache.NMS.IConnection connection = 
> connectionFactory.CreateConnection();
>             connection.Start();
>             Apache.NMS.ISession session = connection.CreateSession();
>             Apache.NMS.ActiveMQ.Commands.ActiveMQTopic inputTopic = new 
> Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("test.topic");
>             _consumer = session.CreateConsumer(inputTopic, "2>1");
>             Thread _receiveThread = new Thread(_receiveLoop);
>             _receiveThread.Start();
>             while (!_exit)
>             {
>                 String command = Console.ReadLine();
>                 if (command == "exit")
>                 {
>                     _exit = true;
>                 }
>             }
>             _consumer.Close();
>             _receiveThread.Join();
>         }
>         private static void _receiveLoop()
>         {
>             while (!_exit)
>             {
>                 Apache.NMS.ActiveMQ.Commands.ActiveMQTextMessage message = 
> (Apache.NMS.ActiveMQ.Commands.ActiveMQTextMessage)_consumer.Receive();
>                 Console.WriteLine(message.Content.ToString() +  " 
> [looping...]");
>             }
>         }
>     }
> }

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

Reply via email to