2011-09-23 63 views
0

我們有一個場景,我們需要通過內存中的activemq代理髮送同步消息。我們的同步客戶端的代碼如下所示:在內存中ActiveMQ在完全創建之前試圖響應臨時隊列?

Session responseSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
TemporaryQueue responseQ = responseSession.createTemporaryQueue(); 
msg.setJMSReplyTo(responseQ); 
QueueReceiver qReceiver = ((QueueSession) responseSession).createReceiver(responseQ); 
sendMessage(msg, false, timeout); 
Message response = qReceiver.receive(timeout); 

我們大多數的服務器響應代碼工作正常,但有時我們得到這樣一個堆棧跟蹤時間:

javax.jms.InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue://ID:<removed> 
at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1632) 
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:231) 
at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:269) 

我懷疑的根本問題是臨時隊列未完全設置,或者尚未發佈,或者在服務嘗試向其發佈消息時所做的事情。在我的服務器代碼中,我將發送調用封裝在一個捕獲InvalidDestinationException異常的循環中,休眠一秒鐘並再次嘗試,直到成功。由於我已經添加了這個,所以無論何時我在第二次嘗試中看到異常時都可以使用。

我做錯了什麼?我應該在客戶端上做些什麼來同步或刷新,或者在將消息發送到服務器之前確保臨時隊列已啓動?有什麼我應該在服務器端做的,以確保隊列已啓動?如果它認爲它不在那裏,我可以安全地嘗試在服務器端創建臨時隊列嗎?

注意:我們使用的是ActiveMQ 5.3.0,但今天我嘗試了5.5.0,獲得了相同的結果。

+0

由於您的發送/接收超時,您是否在檢查/觀察發生超時? – nos

+0

糟糕,我應該提到在這種情況下,我們的超時時間爲0;不定。 – kenen

回答

0

這很奇怪,我不認爲它應該發生,因爲臨時目的地是在本地創建的,應該位於臨時目的地的連接圖中。如果你可以創建一個簡單的JUnit測試用例來演示這個問題,你應該打開一個新的Jira並附加它以供審查。

+0

在這種情況下,客戶端和服務器使用內存代理在同一個JVM中運行。但兩者都使用不同的連接。這會有所作爲嗎?很奇怪我無法創建一個單元測試來證明同樣的問題。我正在做同樣的事情,我已經放入生產代碼來強制這個問題。在客戶端啓動10個線程的FixedThreadPool執行程序,向服務器發送1000個同步消息。在測試期間,服務器幾乎總是拋出InvalidDestinationException幾次。 – kenen

相關問題