[英]ActiveMQ does not actually respect memory limits
我試圖將ActiveMQ設置為使用內存限制和生產者流控制,以使我看不到當內存不足時嘗試發送消息時可以看到的掛起行為。 我很幸運地關注了Producer Flow Control , My producer塊和Connection Configuration URI上的文檔。
我遇到的問題是這些設置實際上似乎並沒有被正確接受。
我的ActiveMQ代理的設置如下所示(在我的Spring配置中)(我已經對此做了一些消毒,因此可能不是100%有效的Spring配置):
<bean id="broker" class="org.apache.activemq.broker.BrokerService"
init-method="start">
<property name="brokerName" value="broker" />
<property name="persistent" value="false" />
<property name="useJmx" value="true" />
<property name="managementContext" ref="mgmtContext" />
<property name="transportConnectorURIs">
<list>
tcp://localhost:1234?jms.prefetchPolicy.queuePrefetch=0&jms.useAsyncSend=false&jms.alwaysSyncSend=true
</list>
</property>
<property name="destinations">
<list>
<bean class="org.apache.activemq.command.ActiveMQQueue">
<property name="physicalName" value="requests"></property>
</bean>
<bean class="org.apache.activemq.command.ActiveMQQueue">
<property name="physicalName" value="responses"></property>
</bean>
</list>
</property>
</bean>
然后在我的代碼init方法之一中設置以下內容:
broker.getSystemUsage().setSendFailIfNoSpace(true);
broker.getSystemUsage().setSendFailIfNoSpaceAfterTimeout(5000);
// Limit memory usage to 10MB
broker.getSystemUsage().getMemoryUsage().setLimit(10 * 1024 * 1024);
但是,當我運行代碼時,仍然在日志中看到如下內容:
2013-Mar-14 14:47:31.538 GMT-06:00 DEBUG [ActiveMQ Transport: tcp:///127.0.0.1:45846@18086] [org.apache.activemq.usage.Usage:fireEvent] [Usage.java:245] [] [] [] - Main:memory: usage change from: 5640% of available memory, to: 0% of available memory
因此ActiveMQ似乎公然違反了設置的內存限制。
我仍然看到如果將足夠大的消息放入隊列中,甚至如果我將非常大的消息放入隊列中,都可能發生OOM錯誤,從而可能發生阻塞行為。
如何可靠地配置ActiveMQ以限制其內存使用量。
哈,您嘗試直接使用xml文件配置代理嗎? 您可以這樣操作(摘自官方Java示例 ):
BrokerService經紀人= BrokerFactory.createBroker(configUrl);
稍后我將嘗試獲取正在運行的Spring示例
我已經嘗試過了,但是我無法解決我要尋找的東西,但是我終於在下面的鏈接中獲得了完整的信息
http://blogs.sourceallies.com/2014/10/activemq-memory-tuning/
由於上述線程,我得到了解決方案。 上面的線程有很多信息。 我已如下更改activemq.xml
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="2048 mb"/>
<!--Earlier it use to be
<memoryUsage limit="64 mb"/>
-->
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
對於希望通過編程方式管理經紀人限額的任何人,下面是一個示例:
@Bean
public BrokerService broker()
throws Exception {
final BrokerService broker = new BrokerService();
broker.addConnector("tcp://localhost:61616");
broker.addConnector("vm://localhost");
broker.setPersistent(false);
broker.getConsumerSystemUsage().getMemoryUsage().setLimit(100 * 1024);
broker.getConsumerSystemUsage().getStoreUsage().setLimit(1024 * 1024);
broker.getConsumerSystemUsage().getTempUsage().setLimit(100 * 1024);
return broker;
}
感謝這篇文章的起點: 如何在Spring Boot中設置ActiveMQ端口?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.