【问题标题】:request response with activemq - always send double response使用 activemq 请求响应 - 始终发送双重响应
【发布时间】:2011-06-03 21:10:24
【问题描述】:

我是 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("----------------------------------------------------");
                }

在我的理解中,发生这种情况是因为监听器中有一个循环发送响应到同一个队列。

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

非常感谢, 克里斯

【问题讨论】:

    标签: c# activemq


    【解决方案1】:

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

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

    问候, 克里斯

    【讨论】:

      【解决方案2】:

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

      问候 蒂姆。 www.fusesource.com

      【讨论】:

      • 嗨蒂姆;目标参数是队列名称,用作构造函数参数,这样我就可以为一个队列创建一个侦听器。我想做的是一个监听器,它监视指定队列,然后通过发送消息来响应它。希望对您有所帮助,并感谢蒂姆的回复。 :)
      • 通常请求/响应涉及两个独立的目的地,一个通常是标准主题或接收请求的队列,另一个通常是请求处理程序发送响应的临时目的地。在同一个目的地发送请求和响应是让你陷入循环的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 2017-03-01
      • 2020-07-29
      • 2014-05-26
      相关资源
      最近更新 更多