запросить ответ с помощью 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("----------------------------------------------------");
                }

В моем понимании, это произошло из-за того, что в слушателе была циклическая отправка ответа на ту же Очередь.

Не могли бы вы, ребята, помочь мне, как это исправить?

Большое спасибо, Крис


person Chris Valley    schedule 05.01.2011    source источник


Ответы (2)


Эта проблема решена путем использования одного и того же сеанса для ответа слушателя и производителя. В моем коде я использовал разные сеансы для прослушивания и ответа производителя, поэтому создал циклический цикл.

С созданием одного сеанса эта проблема решена. не стесняйтесь комментировать это ;)

С уважением, Крис

person Chris Valley    schedule 06.01.2011

Ваш пример немного неполный, так как вы не показываете, какие имена всех пунктов назначения вы используете, но похоже, что у вас есть потребитель, создающий производителя в своем обратном вызове onMessage, который производит в ту же очередь, что и исходный потребитель, что было бы конечно создать круговую петлю. Можете ли вы привести полный пример или лучше объяснить, чего вы пытаетесь достичь здесь?

С уважением Тим. www.fusesource.com

person Tim Bish    schedule 05.01.2011
comment
Привет Тим; Параметр назначения — это имя очереди, используемое в качестве параметра конструктора, чтобы я мог создать прослушиватель для одной очереди. Что я хотел бы сделать, так это прослушиватель, который отслеживает очередь назначений, а затем отвечает на нее, отправляя сообщение. надеюсь, что это поможет, и спасибо за ответ Тим. :) - person Chris Valley; 06.01.2011
comment
Как правило, запрос/ответ включает в себя два отдельных адресата: один обычно является стандартной темой или очередью, которая получает запрос, а другой обычно является временным адресатом, на который обработчик запросов отправляет ответ. Отправка запроса и ответа в одно и то же место назначения — это то, что заводит вас в циклы. - person Tim Bish; 07.01.2011