2015-02-19 5 views
1

Я пытаюсь настроить 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, что заставило брокера остановить производителей после достижения предела памяти. Я не мог найти ничего в документации о том, что я делаю неправильно.

+0

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

ответ

0

мы используем storeCursor и установить ограничение памяти следующим образом ... это будет ограничить объем памяти для всех очередей в 100MB ...

<destinationPolicy> 
     <policyMap> 
      <policyEntries> 
       <policyEntry queue=">" producerFlowControl="false" memoryLimit="100mb"> 
        <pendingQueuePolicy> 
         <storeCursor/> 
        </pendingQueuePolicy> 
       </policyEntry> 
      </policyEntries> 
     </policyMap> 
    </destinationPolicy> 

убедитесь, что вы установите «пункты назначения», что ваш политика должна применяться в отношении ... в моих примерах XML это делается с помощью queue=">", но ваш пример использует new PolicyMap() ... попробуйте позвонить policyEntry.setQueue(">") вместо того, чтобы обратиться ко всем очередям или добавить конкретные направления к вашему PolicyMap и т.д.

см. этот тест для полного примера ...

https://github.com/apache/activemq/blob/master/activemq-unit-tests/src/test/java/org/apache/activemq/PerDestinationStoreLimitTest.java

+0

I * do * использование магазин курсор. И я не настраиваю ActiveMQ через XML. –

+0

Я пробовал оба: policyEntry.setPendingQueuePolicy (новый StorePendingQueueMessageStoragePolicy()); policyEntry.setPendingDurableSubscriberPolicy (новый StorePendingDurableSubscriberMessageStoragePolicy()); и настройка через XML. Ничего не помогает. –

+0

неясно, какой именно курсор вы использовали ... но у нас была такая же проблема с использованием курсора VM, и это разрешило ... независимо от того, используете ли вы XML/Java для его настройки, основные проблемы звучат одинаково. ... мой пример показывает, как мы обращались к нему ... возможно, его разные, хотя –

Смежные вопросы