2011-01-05 3 views
2

Я новичок в 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, а другой - нет.

Мой обходной путь, чтобы остановить эту ситуацию cheking от свойств 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("----------------------------------------------------"); 
       } 

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

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

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

ответ

0

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

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

+0

Привет Тим; Параметр назначения - это имя очереди, используется как параметр конструктора, поэтому я могу сделать слушатель для одной очереди. Что я хотел бы сделать, это прослушиватель, который отслеживает очередь назначения, а затем откликнется на него, отправив сообщение. надеюсь, что это поможет, и спасибо за ответ Тим. :) –

+0

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

1

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

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

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

Смежные вопросы