2011-01-05 96 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("----------------------------------------------------"); 
       } 

在我的理解,以阻止這種情況下,發生這種情況,原因是在監聽到相同的隊列圓形發送響應。

你們能幫我解決這個問題嗎?

非常感謝, 克里斯

回答

0

你的樣品是有點不完整,你不顯示什麼都目的地名稱是您正在使用,但它看起來你有消費者在其回調的onMessage創建一個製片人說產生到與原始消費者相同的隊列,這當然會產生循環。你能舉一個完整的例子,或者更好地解釋你在這裏試圖完成什麼?

Registers Tim。 www.fusesource.com

+0

添喜;目標參數是隊列名稱,用作構造參數,因此我可以爲一個隊列創建一個偵聽器。 我想要做的是監聽指定隊列,然後通過發送消息進行響應的監聽器。 希望有所幫助,並感謝蒂姆的迴應。 :) – 2011-01-06 00:41:00

+0

通常,請求/響應包含兩個獨立的目標,一個通常是接收請求的標準主題或隊列,另一個通常是請求處理程序發送響應的臨時目標。在相同的目的地發送請求和響應是什麼讓你進入循環。 – 2011-01-07 19:21:51

1

此問題通過使用相同的會話來監聽器和生產者響應解決。 在我的代碼中,我使用了不同的會話來監聽和生成器響應,因此創建了循環循環。

通過創建單個會話,解決了此問題。 隨意對此置評;)

的問候, 克里斯