【发布时间】:2015-02-27 01:35:06
【问题描述】:
我尝试为以下行为配置 ActiveMQ:当代理超过其内存限制时,它应该将消息存储在持久性存储中。如果使用如下配置:
BrokerService broker = new BrokerService();
broker.setBrokerName("activemq");
KahaDBPersistenceAdapter persistence = new KahaDBPersistenceAdapter();
persistence.setDirectory(new File(config.getProperty("amq.persistenceDir", "amq")));
broker.setPersistenceAdapter(persistence);
broker.setVmConnectorURI(new URI("vm://activemq"));
broker.getSystemUsage().getMemoryUsage().setLimit(64 * 1024 * 1024L);
broker.getSystemUsage().getStoreUsage().setLimit(1024 * 1024 * 1024 * 100L);
broker.getSystemUsage().getTempUsage().setLimit(1024 * 1024 * 1024 * 100L);
PolicyEntry policyEntry = new PolicyEntry();
policyEntry.setCursorMemoryHighWaterMark(50);
policyEntry.setExpireMessagesPeriod(0L);
policyEntry.setPendingDurableSubscriberPolicy(new StorePendingDurableSubscriberMessageStoragePolicy());
policyEntry.setMemoryLimit(64 * 1024 * 1024L);
policyEntry.setProducerFlowControl(false);
broker.setDestinationPolicy(new PolicyMap());
broker.getDestinationPolicy().setDefaultEntry(policyEntry);
broker.setUseJmx(true);
broker.setPersistent(true);
broker.start();
但是,这不起作用。 ActiveMQ 仍然会消耗尽可能多的内存来存储完整队列。我还尝试删除 PolicyEntry,这会导致代理在达到内存限制后停止生产者。我在文档中找不到任何关于我做错的事情。
【问题讨论】:
-
我将大约 10Gb 的消息放入队列中,发现该队列虽然超过了指定的内存限制约 7 次,但仍保持此因子不变,即不会抛出 OutOfMemoryException。将带有 -Xmx 标志的 JVM 限制为 512 mb 会导致 OOME。我认为,有问题,但至少我可以肯定,如果我给队列 1Gb,JVM 不会失败。
标签: activemq