/ / Prekročený limit pamäte ActiveMQ - activemq

Prekročenie limitu ActiveMQ - activemq

Snažím sa konfigurovať ActiveMQ pre nasledujúce správanie: keď maklér prekročí limit pamäte, mal by uložiť správu v perzistencii skladovanie. Ak používate nasledujúcu konfiguráciu:

    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();

To však nefunguje. ActiveMQ stále spotrebuje toľko pamäte, koľko je potrebné na uloženie celého frontu. Tiež som sa snažil odstrániť PolicyEntry, ktorý spôsobil makléra zastaviť výrobcov po dosiahnutí limitu pamäte. V dokumentácii o tom, čo robím zle, som nenašiel nič.

odpovede:

0 pre odpoveď č. 1

používame storeCursor a nastavte limit pamäte nasledovne ... toto obmedzí množstvo pamäte pre všetky fronty na 100 MB ...

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

Uistite sa, že ste nastavili "ciele", ktoré by vaša politika mala aplikovať proti ... v mojich príkladoch XML sa to robí pomocou queue=">", ale váš príklad používa new PolicyMap()... skúste volať policyEntry.setQueue(">") namiesto toho, aby sa vzťahovali na všetky fronty alebo pridali konkrétne ciele do svojej politiky PolicyMap atď.

pozrite si tento test pre úplný príklad ...

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