2013-08-28 93 views
1

我讀過Active MQ文檔,當代理使用創建連接時,代理刪除了臨時隊列。ActiveMQ NMS臨時隊列在連接關閉時未被破壞

我正在使用Apache NMS v1.5.0和Active MQ 5.1.3,即使連接超出範圍,臨時隊列也始終存在。

我有一個客戶端/服務器場景,客戶端創建一個臨時隊列並創建一條消息,在消息的ReplyTo屬性中指定臨時隊列。 然後,服務器組件讀取消息並開始將消息發送到對隊列的回覆。

不幸的是,當客戶端關閉它的連接時,它創建的臨時隊列不會被刪除。

下面的代碼片段應該說明我的意思。

我創建一個連接,並使用該連接創建一個臨時隊列。 我關閉連接並創建第二個連接。 我不應該能夠使用由第二個連接創建的會話 在臨時隊列上產生和使用消息,但我可以。

有人可以告訴我,如果我在這裏做錯了什麼。我如何獲得活動MQ來刪除臨時隊列。

任何幫助非常感謝。

[Test] 
public void TempQueueTest() 
{ 
    var cf = new ConnectionFactory("tcp://activemq-broker:61616"); 


    using (var connection = cf.CreateConnection()) 
    { 
     connection.Start(); 

     using (var session = connection.CreateSession()) 
     { 
      var normalQueue = session.GetQueue("normalQueue"); 

      ITemporaryQueue tempQueue = session.CreateTemporaryQueue(); 

      using (var producer = session.CreateProducer(normalQueue)) 
      { 

       // create a messasge and put on a normal queue 
       //specify the temp queue as the reply to queue 

       var mesage = new ActiveMQTextMessage("hello"); 
       mesage.ReplyTo = tempQueue as ActiveMQDestination; 
       producer.Send(mesage); 
      } 
     } 
     connection.Stop(); 
    } 


    // ok, connection has been disposed, so the temp queue should be destroyed 

    // create a new connection 
    using (var connection = cf.CreateConnection()) 
    { 
     connection.Start(); 

     using (var session = connection.CreateSession()) 
     { 
      var normalQueue = session.GetQueue("normalQueue"); 

      using (var consumer = session.CreateConsumer(normalQueue)) 
      { 
       var message = consumer.Receive() as ActiveMQTextMessage; 

       // replyToDest is the temp queue created with the previous connection 
       var replyToDest = message.ReplyTo; 


       using (var producer = session.CreateProducer(replyToDest)) 
       { 
        // i shouldn't be able to send a message to this temp queue 
        producer.Send(new ActiveMQTextMessage("this shouldn't work")); 
       } 

       using (var tempConsumer = session.CreateConsumer(replyToDest)) 
       { 
        // is shouldn't be able to receive messages on the temp queue as it should be destroyed 
        var message1 = tempConsumer.Receive() as ActiveMQTextMessage; 
       } 
      } 

     } 
     connection.Stop(); 
    } 

} 
+0

我投票結束這個問題作爲題外話題,因爲它涉及到一個老版本的圖書館。原來的海報在回答中評論說,現在在圖書館的新版本中這不是問題。 –

回答

2

鑑於你正在使用的古代版本,我不知道有什麼方法可以解決這裏發生的事情。代碼看起來是正確的,但是在NMS庫的v1.5.0版本和當前的1.6.0版本之間存在大量的修復,其中很多修復了Temp目標的問題。我建議你嘗試並轉向更高版本以查看問題是否消失。

現在,您可能不得不使用JMX訪問代理並刪除舊的臨時目標。

+0

感謝蒂姆 - 我已經升級了Apache.NMS.dll和Apache.NMS.ActiveMQ.dll到v1.6,它似乎已經解決了這個問題! – RupertHulme

+1

請務必在可以的時候回答問題,謝謝。 –