我們有一個場景,我們需要通過內存中的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,獲得了相同的結果。
由於您的發送/接收超時,您是否在檢查/觀察發生超時? – nos
糟糕,我應該提到在這種情況下,我們的超時時間爲0;不定。 – kenen