2013-02-18 62 views
1

我一直在尋找一個ActiveMQ代理管理命令,告訴它暫停一個隊列 - 那就是:爲什麼暫停隊列而不是經紀人功能?

  • 繼續從生產客戶
  • 停止交付給消費用戶接受郵件,讓排隊積壓增長直到隊列被恢復,因此待辦事項被髮送給客戶端。

我無法找到這樣的命令。最常見的答案是,它應該在客戶端進行管理 - 即找到每個消費者並停止它。其他答案是解決方法,如操縱網絡路由或防火牆,以便客戶端和代理不能再進行通信。

對其他消息隊列的粗略調查表明ActiveMQ在這方面並不罕見。

在我看來,有兩個原因,這個功能可能無法實現:

  • 這是很難實現的 - 但我想不出任何理由。
  • 這是違背信息的設計理念排隊

是哪一個,爲什麼?

回答

4

實施起來可能不太複雜 - 就像你說的那樣。 我不知道這是否是一項主動設計決定,如果沒有需求。其他類似的產品,例如IBM WebSphere MQ,在隊列上實現了「禁止/禁止」,所以它顯然不完全違背消息傳遞的哲學 - 而是一種操作和故障拍攝實時系統的工具。

我有點偏見,但我實際上喜歡從接收中分離發送者(如果這是兩個不同的系統,最終可能會切換/升級/更改..)。

一個簡單的方法來分離系統,並能夠做到你想做的是讓發送者發送到一個隊列「DATA.OUT」,接收者聽另一個「DATA.IN」。然後,您可以使用Apache Camel(通常與ActiveMQ捆綁在一起以實現企業集成模式),以便從DATA.OUT路由到DATA.IN.

Camel Route可以通過JMX啓動/停止,這將實現類似於您所描述的內容。

我想ActiveMQ的設計在這個問題上,而不是你直接在隊列中的中間件層,如Apache Camel做這些事情。

4

新發布的ActiveMQ 5.12支持暫停隊列。0:

當隊列爲 「暫停」:

  • 發送到關聯的消費者仍然

  • 消息NO消息隊列上

  • 能力要被入隊能夠瀏覽隊列

  • 所有的JMX計數器該隊列可用且正確。

...

實現暫停/恢復/ isPaused得到隊列視圖的MBean OPS和屬性

暫停時,沒有派遣常規隊列消費者,發送 和瀏覽工作正常。任何機上消息將繼續飛行 ,直到正常爲止。

https://issues.apache.org/jira/browse/AMQ-5229

如果啓用椒(我認爲這是默認時下啓用),則可以使用類似下面的捲曲請求暫停隊列:

curl --user admin:admin http://127.0.0.1:8161/api/jolokia/exec/org.apache.activemq:brokerName=localhost,destinationName=myQueue,destinationType=Queue,type=Broker/pause 

(使用默認的用戶名,密碼和經紀人的名字和一個名爲myQueue中)隊列

,以恢復隊列替換「暫停」與「恢復」。

+3

雖然這在理論上可以回答的問題,[這將是優選的](// meta.stackoverflow.com/q/8259)以包括回答的主要部分在這裏,並提供鏈路參考。 – 2015-08-23 09:36:29

+0

我同意這些評論,但我仍然對單挑表示感謝。謝謝。 – slim 2015-08-23 10:58:25

+0

是否有可用的代碼示例?我需要利用這個功能 – 2016-04-13 14:51:08