2017-06-14 49 views
0

我有一個使用Spring AMQP的項目。我有兩個SimpleMessageListenerContainer,一個帶有服務器自我聲明的隊列(amq-gen),另一個帶有給定名稱的隊列。 我使用一個SimpleRoutingConnectionFactory和兩個CachingConnectionFactory。對於錯誤檢測,我有一個ConnectionListener,ListenerContainerConsumerFailedEvent和一個ConditionalExceptionLogger。Spring AMQP和兩個RabbitMQ服務器之間的變化

這個想法是在AMQP連接中檢測到錯誤後在兩個Rabbit服務器之間切換,但是當AMQP連接出現錯誤時,ConditionalExceptionLogger中會出現幾個錯誤,ListenerContainerConsumerFailedEvent類型的幾個事件,在服務器之間自動切換的事實。

什麼可能是最好的方式做自動切換自動給予了一些重試?

謝謝

回答

1

一個具有自我宣告隊列服務器(AMQ根)

你不能做到這一點;如果使用代理聲明的隊列名稱,則第二個代理不知道它,並且容器將嘗試聲明它,這是不允許的。

取而代之,使用Spring AMQP AnonymousQueue,它具有與代理聲明的隊列相同的特性(自動刪除,不是持久的),但具有由框架生成的名稱,因此可以在故障轉移時進行聲明。

+0

感謝您的快速回復Gary。我沒有選擇(記住這個轉換:https://stackoverflow.com/questions/40802855/spring-amqp-and-shutdownsignalexception)。我使用你告訴我的技巧,它通過爲每個新連接創建一個新隊列來工作。問題是連接的錯誤檢測和SimpleMessageListenerContainer並行跳轉,並且很難辨別真正存在阻止重新連接的問題,並且必須切換到其他服務器。 – jandres

+1

在容器上,將'autoDeclare'設置爲'false'並將'declarationRetries'設置爲'0',容器將快速失敗並自行停止。你可以添加一個'ApplicationListener'來檢測'AsyncConsumerStoppedEvent'。在故障轉移並重新聲明隊列後,您可以更新容器中的隊列名稱並重新啓動它。 –