簡體   English   中英

ActiveMQ實際上不遵守內存限制

[英]ActiveMQ does not actually respect memory limits

我試圖將ActiveMQ設置為使用內存限制和生產者流控制,以使我看不到當內存不足時嘗試發送消息時可以看到的掛起行為。 我很幸運地關注了Producer Flow ControlMy 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM