2011-08-10 30 views
1

我正在使用ActiveMQ並且有一個問題:在等待消費者的同時,持久消息是如何以及何時真正交換到磁盤的?ActiveMq,未消費的消息始終在代理的內存中?

我正在使用虛擬主題,並創建隊列使用者以接收來自它們的消息。所有消息都是持續存在(我已驗證所有未使用消息的記錄確實存在於持久性存儲中)

我有多個消費者定期上線和下線。將jconsole連接到activemq後,我注意到所有未被佔用的消息似乎都包含在代理的內存中。他們不會交換到磁盤,至少我無法驗證。 設置memoryUsage或打開producerFlowControl - 沒有任何影響。如果流量控制打開時,Broker是否被阻塞,如果流量控制打開,MemoryPercentUsage會繼續增加,或者MemoryPercentUsage持續增加。

當activemq通過將消息存儲到磁盤/持久性存儲來釋放內存時?還是這樣做?我如何驗證它是否是磁盤空間而不是RAM,這會在隊列中有數百萬個未被佔用的消息長時間運行時限制代理?

回答

0

請再次檢查memoryUsage,您可以指定消息應該持續的不同限制。在以下示例中,當64 MB內存已滿時,它將開始在磁盤上寫入高達100 GB的數據。

<systemUsage> 
    <systemUsage> 
    <memoryUsage> 
     <memoryUsage limit="64 mb" /> 
    </memoryUsage> 
    <storeUsage> 
     <storeUsage limit="100 gb" /> 
    </storeUsage> 
    </systemUsage> 
</systemUsage> 
+0

喜卡卡,謝謝你的回覆。如果將'producerFlowControl'設置爲** false **,以便存儲消息呢?如果你知道,'storageUsage' - 它總是關於硬盤空間,或者它可能意味着數據庫的大小? – Paul

0

嘗試使用storeCursor和設置在destinationPolicy內存的限制,這將強制執行每個隊列的限制內存/消息將在從磁盤拉量...

<destinationPolicy> 
     <policyMap> 
      <policyEntries> 
       <policyEntry queue=">" producerFlowControl="false" memoryLimit="100mb"> 
        <pendingQueuePolicy> 
         <storeCursor/> 
        </pendingQueuePolicy> 
       </policyEntry> 
      </policyEntries> 
     </policyMap> 
    </destinationPolicy> 
相關問題