繁体   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