在我的JMS應用程序上,我們使用生產者上的臨時隊列來接收消費者應用程序的回覆。ActiveMQ:如何在使用臨時隊列時處理代理故障轉移
我面對我的結束正是同樣的問題在這個線程中提到:http://activemq.2283324.n4.nabble.com/jira-Created-AMQ-3336-Temporary-Destination-errors-on-H-A-failover-in-broker-network-with-Failover-tt-td3551034.html#a3612738
每當我重新啓動我的網絡中的任意經紀人,我得到很多象這樣的錯誤在我的消費者應用程序日誌嘗試發送回覆臨時隊列:
javax.jms.InvalidDestinationException:
Cannot publish to a deleted Destination: temp-queue://ID:...
然後,我看到有加里的反應表明使用
jms.watchTopicAdvisories=false
爲AU rl param在客戶端brokerURL
上。我立即用這個附加參數更改了我的客戶端代理網址。
javax.jms.JMSException:
The destination temp-queue:
//ID:client.host-65070-1308610734958-2:1:1 does not exist.
我使用ActiveMQ的5.5版本:但是現在,當我重新啓動我的經紀人在網絡這個倒換測試,我看到了這樣的錯誤。而我的客戶的經紀人URL看起來是這樣的:
failover:(tcp://amq-host1:61616,tcp://amq-host2.tred.aol.com:61616,tcp://amq-host3:61616,tcp://amq-host4:61616)?jms.useAsyncSend=true&timeout=5000&jms.watchTopicAdvisories=false
另外這裏是4個經紀人我的一個ActiveMQ的XML配置: amq1.xml
能有人在這裏請看看這個問題,並建議我有什麼錯誤,我我正在製作這個設置。
更新:
爲了進一步澄清,我怎麼在我的代碼做請求 - 響應:
- 我已經使用每生產目標(即臨時隊列),並將其設置在答覆向每封郵件的標題。
- 我已經在JMSCorrelationID標頭中發送了每個消息的唯一關聯標識符。
- 據我所知即使駱駝和Spring也使用臨時隊列來請求響應機制。唯一的區別是Spring JMS實現爲每條消息創建並銷燬臨時隊列,而我爲生產者的生命週期創建臨時隊列。當客戶端(生產者)應用程序關閉時,此臨時隊列會被銷燬,或者AMQ代理在意識到沒有活動的生產者與此臨時隊列連接時會被銷燬。
- 我已經在Producer端的每條消息上設置了消息到期時間,以便消息不會在隊列中滯留太久(60秒)。
新的'JMSException'是剛登錄還是拋入客戶端代碼?另外,客戶端發送給代理的每條消息是否拋出異常,或者故障轉移完成時異常是否停止? (即只有在客戶端沒有連接的時候拋出異常?) – Bringer128
[似乎是](http://activemq.apache.org/advisory-message.html#AdvisoryMessage-Disablingadvisorymessages)有幾件事情您需要在XML配置中添加'jms.watchTopicAdvisories = false',即'',並靜態配置您的網絡。 (你的amq1.xml文件給我404 Not Found) –
opyate
@ Bringer128:感謝您的評論。該JMS異常在重新連接後生產者連接的其他AMQ代理上引發。而且一旦發生這種情況,JMS生產者只是停止接收來自消費者的任何響應,因爲AMQ代理不能將回復發回給具有上述JMS異常的生產者。 – anubhava