使用activemq请求响应 - 始终发送双响应

时间:2011-01-05 08:42:47

标签: c# activemq

我是activeMq的新手。我试图像这样创建一个简单的请求响应。

    public Listener(string destination)
    {
        // set factory
        ConnectionFactory factory = new ConnectionFactory(URL);
        IConnection connection;
        try
        {
            connection = factory.CreateConnection();
            connection.Start();

            ISession session = connection.CreateSession();

            // create consumer for designated destination
            IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue(destination));

            consumer.Listener += new MessageListener(consumer_Listener);

            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
            throw new Exception("Exception in Listening ", ex);
        }
    }

OnMessage

    static void consumer_Listener(IMessage message)
    {

        IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
        using (IConnection connection = factory.CreateConnection())
        {
            //Create the Session
            using (ISession session = connection.CreateSession())
            {
                //Create the Producer for the topic/queue
                // IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTempQueue(message.NMSDestination));

                IMessageProducer producer = session.CreateProducer(message.NMSDestination);

                // Create Response
                // IMessage response = session.CreateMessage();
                ITextMessage response = producer.CreateTextMessage("Replied from VS2010 Test");

                //response.NMSReplyTo = new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("testQ1");
                response.NMSCorrelationID = message.NMSCorrelationID;

                if (message.NMSReplyTo != null)
                {
                    producer.Send(message.NMSReplyTo, response);
                    Console.WriteLine("Receive: " + ((ITextMessage)message).NMSCorrelationID);
                    Console.WriteLine("Received from : " + message.NMSDestination.ToString());
                    Console.WriteLine("----------------------------------------------------");
                }
            }
        }


    }

每当我尝试向侦听器发送请求时,响应总是反复发送。第一个响应将具有NMSReplyTo属性而另一个不具有。

我通过检查NMSReplyTo属性来阻止这种情况的解决方法

                if (message.NMSReplyTo != null)
                {
                    producer.Send(message.NMSReplyTo, response);
                    Console.WriteLine("Receive: " + ((ITextMessage)message).NMSCorrelationID);
                    Console.WriteLine("Received from : " + message.NMSDestination.ToString());
                    Console.WriteLine("----------------------------------------------------");
                }

根据我的理解,这是因为侦听器中有一个循环发送响应到同一个队列。

你能帮助我解决这个问题吗?

非常感谢, 克里斯

2 个答案:

答案 0 :(得分:2)

通过对侦听器和生成器响应使用相同的会话来解决此问题。 在我的代码中,我使用不同的会话进行监听和生成器响应,因此创建循环循环。

创建单个会话后,此问题就解决了。 随便对此发表评论;)

此致 克里斯

答案 1 :(得分:1)

您的示例有点不完整,因为您没有显示您正在使用的所有目标名称,但看起来您让消费者在其onMessage回调中创建了一个生产者,该回调生成与原始使用者相同的队列,这当然会创建一个循环循环。你能举出一个完整的例子或者更好地解释一下你在这里要完成的是什么吗?

此致 蒂姆。 www.fusesource.com