2014-05-01 60 views
3

我使用ActiveMQ作爲消息服務器的外部應用程序,但也爲我的內部消息。ActiveMQ - 如何預留一些隊列的存儲空間?

如果我的應用程序停機時間過長,外部應用程序將全部使用ActiveMq服務器。但是當我重新啓動它時,它不能消費消息,因爲它不能發送「內部」消息(我的路由是事務性的)。所以所有的系統都被阻塞了。

有沒有辦法爲我的內部消息保留一些存儲空間?或者是 - 有可能限制一些隊列的大小?

感謝

回答

2

是的,你可以使用一個destination policy和生產流程控制來限制所有或特定的隊列所消耗的最大內存。在你activemq.xml中,你需要添加一個節是這樣的:

<destinationPolicy> 
    <policyMap> 
     <policyEntries> 
      <policyEntry queue=">" producerFlowControl="true" memoryLimit="50mb" /> 
     </policyEntries> 
    </policyMap> 
</destinationPolicy> 

destination wildcard「>」將匹配所有隊列。您可以更改模式以僅匹配您希望策略影響的那些隊列。

受策略影響的每個隊列都將其內存限制設置爲50MB。這意味着您需要考慮隊列數來計算隊列消耗的最大內存以及它是否適合可用的VM堆空間。

該策略僅限制要使用的內存量。 temp- and file-store limits只能在經紀人全局設置,而不能按每個目的地設置。

+0

這種安靜的配置意味着:「所有隊列必須共享50 MB」或「每個隊列不得包含多於50MB」?和其他問題,我使用持久隊列,「memoryLimit」是不是限制空間_in內存_(而不是_in storage_)? – Dush

+0

@Dush我已經更新了我的答案。 – Ralf

+0

好的,我想這是回答我的問題:如果我想爲某些隊列預留一些**商店**空間,我必須創建另一個經紀人... – Dush

1

我試圖做到這一點作爲一個編輯到對方的回答,但不獲批准

您可以限制使用per destination policies個人隊列使用的存儲。調整storeUsageHighWaterMark屬性,默認爲100%。從文檔:

the tipping point at which a system usage store limit will cause a sent to block

所以,你的配置是這樣的:

<destinationPolicy> 
    <policyMap> 
    <policyEntries> 
     <policyEntry queue=">" storeUsageHighWaterMark="75" producerFlowControl="true" > 
     </policyEntry> 
     <policyEntry queue="INTERNAL.>" storeUsageHighWaterMark="100" producerFlowControl="true"> 
     </policyEntry> 
    </policyEntries> 
    </policyMap> 
</destinationPolicy> 

這表明隨着INTERNAL.開始隊列可以阻止之前使用的存儲空間的100%。一旦有75%的存儲空間被使用,其他隊列就會被阻塞。