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ď č. 1použí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 ...