Я пытаюсь настроить ActiveMQ для следующего поведения: когда брокер превышает свой предел памяти, он должен хранить сообщение в хранилище постоянного хранения. Если используется следующая конфигурация:Превышен предел памяти 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, что заставило брокера остановить производителей после достижения предела памяти. Я не мог найти ничего в документации о том, что я делаю неправильно.
Я поставлен в очереди около 10Гб сообщений и обнаружил, что очереди, хотя превышение заданного предела памяти примерно в 7 раз, сохраняет этот фактор постоянным, т.е. не бросает OutOfMemoryException. Ограничение JVM с флагом -Xmx до 512 МБ вызывает OOME. Я думаю, что-то не так, но, по крайней мере, я могу быть уверен, что если я дам 1Gb в очередь, JVM не подведет. –