From 63f045e5c97419b1bb93b5475226832a9c7104a4 Mon Sep 17 00:00:00 2001 From: "Christopher L. Shannon (cshannon)" Date: Mon, 28 Dec 2015 16:40:10 +0000 Subject: [PATCH] https://issues.apache.org/jira/browse/AMQ-6109 The chooseValue method in DestinationMap will now always return the exact match, if there is one, else it will then sort as before. (cherry picked from commit 8e2176d93c95d847c813f54d54aaf9bafba4d5c4) --- .../activemq/filter/DestinationMap.java | 11 +++- .../activemq/java/JavaPolicyEntryTest.java | 51 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/activemq-client/src/main/java/org/apache/activemq/filter/DestinationMap.java b/activemq-client/src/main/java/org/apache/activemq/filter/DestinationMap.java index fd07b7a081..b3612037fc 100755 --- a/activemq-client/src/main/java/org/apache/activemq/filter/DestinationMap.java +++ b/activemq-client/src/main/java/org/apache/activemq/filter/DestinationMap.java @@ -16,6 +16,7 @@ */ package org.apache.activemq.filter; +import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -201,12 +202,18 @@ public class DestinationMap { * @return the largest matching value or null if no value matches */ @SuppressWarnings({"rawtypes", "unchecked"}) - public Object chooseValue(ActiveMQDestination destination) { + public Object chooseValue(final ActiveMQDestination destination) { Set set = get(destination); if (set == null || set.isEmpty()) { return null; } - SortedSet sortedSet = new TreeSet(set); + SortedSet sortedSet = new TreeSet(new Comparator() { + @Override + public int compare(DestinationMapEntry entry1, DestinationMapEntry entry2) { + return destination.equals(entry1.destination) ? -1 : (destination.equals(entry2.destination) ? 1 : entry1.compareTo(entry2)); + } + }); + sortedSet.addAll(set); return sortedSet.first(); } diff --git a/activemq-runtime-config/src/test/java/org/apache/activemq/java/JavaPolicyEntryTest.java b/activemq-runtime-config/src/test/java/org/apache/activemq/java/JavaPolicyEntryTest.java index 29b655e8cd..9c2df22ff7 100644 --- a/activemq-runtime-config/src/test/java/org/apache/activemq/java/JavaPolicyEntryTest.java +++ b/activemq-runtime-config/src/test/java/org/apache/activemq/java/JavaPolicyEntryTest.java @@ -406,6 +406,57 @@ public class JavaPolicyEntryTest extends RuntimeConfigTestSupport { verifyQueueLimit("queue.test", 1024); } + @Test + public void testModWithMultipleChildPolicies() throws Exception { + BrokerService brokerService = new BrokerService(); + PolicyMap policyMap = new PolicyMap(); + PolicyEntry entry = new PolicyEntry(); + entry.setQueue("queue.>"); + entry.setMemoryLimit(1024); + PolicyEntry entry2 = new PolicyEntry(); + entry2.setQueue("queue.child.>"); + entry2.setMemoryLimit(2048); + PolicyEntry entry3 = new PolicyEntry(); + entry3.setQueue("queue.child.test"); + entry3.setMemoryLimit(5000); + PolicyEntry entry4 = new PolicyEntry(); + entry4.setQueue("queue.child.test.test"); + entry4.setMemoryLimit(5100); + PolicyEntry entry5 = new PolicyEntry(); + entry5.setQueue("queue.child.a"); + entry5.setMemoryLimit(5200); + policyMap.setPolicyEntries(Arrays.asList(entry, entry2, entry3, entry4, entry5)); + brokerService.setDestinationPolicy(policyMap); + + startBroker(brokerService); + assertTrue("broker alive", brokerService.isStarted()); + + brokerService.getBroker().addDestination( + brokerService.getAdminConnectionContext(), new ActiveMQQueue("queue.child.>"), false); + brokerService.getBroker().addDestination( + brokerService.getAdminConnectionContext(), new ActiveMQQueue("queue.test"), false); + brokerService.getBroker().addDestination( + brokerService.getAdminConnectionContext(), new ActiveMQQueue("queue.child.test2"), false); + + //check destinations before policy updates + verifyQueueLimit("queue.test", 1024); + verifyQueueLimit("queue.child.test2", 2048); + + //Reapply new limit to policy 2 + entry3.setMemoryLimit(4194304); + javaConfigBroker.modifyPolicyEntry(entry); + TimeUnit.SECONDS.sleep(SLEEP); + + //should be unchanged + verifyQueueLimit("queue.child.>", 2048); + + //verify new dest and existing are changed + verifyQueueLimit("queue.child.test", 4194304); + + //verify that destination at a higher level policy is not affected + verifyQueueLimit("queue.test", 1024); + } + @Test public void testModParentPolicy() throws Exception { BrokerService brokerService = new BrokerService();