2011-01-05 12 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プロパティを持ち、もう一方の応答は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("----------------------------------------------------"); 
       } 

をchekingすることにより、このような状況を停止する

私の回避策同じキューにリスナーが円形で、送信応答があったので、これが起こりました。

どうすればこの問題を解決できますか?

多くのおかげで、 クリス

答えて

0

あなたのサンプルでは、​​すべての送信先名は、使用しているが何であるか表示されませんように、ビット不完全ですが、あなたは、消費者がそののonMessageコールバックでプロデューサーを作成しているように見えることオリジナルのコンシューマと同じキューに生成されます。これはもちろん、循環ループを作成します。ここで成し遂げようとしていることを、完全な例を挙げたり、よりよく説明したりできますか?

よろしくお願いいたします。 Tim。 www.fuseource.com

+0

こんにちはティムは、 destinationパラメータはキュー名です。コンストラクタパラメータとして使用するので、1つのキューに対してリスナを作成できます。 私は何をしたいのですが、指定キューを監視し、メッセージを送信して応答するリスナーです。 ご協力いただきありがとうございました。返信いただきありがとうございます。 :) –

+0

一般に、要求/応答には2つの別個の宛先が含まれます.1つは通常、標準のトピックまたは要求を受け取るキューで、もう1つは通常、要求ハンドラが応答を送信する一時的な宛先です。同じ宛先で要求と応答を送信することが、循環ループになっています。 –

1

この問題は、リスナーとプロデューサの応答に同じセッションを使用することで解決しました。 私のコードでは、リスニングとプロデューサのレスポンスに異なるセッションを使用していたため、循環ループが作成されました。

単一のセッションを作成すると、この問題は解決しました。 はこれについてコメントすること自由に感じ;)

よろしく、 クリス

関連する問題