/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.java; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collection; import java.util.concurrent.TimeUnit; import org.apache.activemq.AbstractVirtualDestTest; import org.apache.activemq.broker.BrokerPlugin; import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.region.DestinationInterceptor; import org.apache.activemq.broker.region.virtual.CompositeQueue; import org.apache.activemq.broker.region.virtual.FilteredDestination; import org.apache.activemq.broker.region.virtual.VirtualDestination; import org.apache.activemq.broker.region.virtual.VirtualDestinationInterceptor; import org.apache.activemq.broker.region.virtual.VirtualTopic; import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.command.ActiveMQTopic; import org.apache.activemq.plugin.java.JavaRuntimeConfigurationBroker; import org.apache.activemq.plugin.java.JavaRuntimeConfigurationPlugin; import org.apache.activemq.util.Wait; import org.junit.Test; public class JavaVirtualDestTest extends AbstractVirtualDestTest { public static final int SLEEP = 2; // seconds private JavaRuntimeConfigurationBroker javaConfigBroker; public void startBroker(BrokerService brokerService) throws Exception { this.brokerService = brokerService; brokerService.setPlugins(new BrokerPlugin[]{new JavaRuntimeConfigurationPlugin()}); brokerService.setPersistent(false); brokerService.start(); brokerService.waitUntilStarted(); javaConfigBroker = (JavaRuntimeConfigurationBroker) brokerService.getBroker().getAdaptor(JavaRuntimeConfigurationBroker.class); } @Test public void testNew() throws Exception { startBroker(new BrokerService()); assertTrue("broker alive", brokerService.isStarted()); // default config has support for VirtualTopic.> DestinationInterceptor[] interceptors = brokerService.getDestinationInterceptors(); assertEquals("one interceptor", 1, interceptors.length); assertTrue("it is virtual topic interceptor", interceptors[0] instanceof VirtualDestinationInterceptor); VirtualDestinationInterceptor defaultValue = (VirtualDestinationInterceptor) interceptors[0]; assertEquals("default names in place", "VirtualTopic.>", defaultValue.getVirtualDestinations()[0].getVirtualDestination().getPhysicalName()); exerciseVirtualTopic("VirtualTopic.Default"); javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("A.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); assertEquals("one interceptor", 1, interceptors.length); assertTrue("it is virtual topic interceptor", interceptors[0] instanceof VirtualDestinationInterceptor); // update will happen on addDestination exerciseVirtualTopic("A.Default"); VirtualDestinationInterceptor newValue = (VirtualDestinationInterceptor) interceptors[0]; assertEquals("new names in place", "A.>", defaultValue.getVirtualDestinations()[0].getVirtualDestination().getPhysicalName()); // apply again - ensure no change javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("A.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); assertSame("same instance", newValue, brokerService.getDestinationInterceptors()[0]); } @Test public void testNewComposite() throws Exception { startBroker(new BrokerService()); assertTrue("broker alive", brokerService.isStarted()); CompositeQueue queue = buildCompositeQueue("VirtualDestination.CompositeQueue", Arrays.asList(new ActiveMQQueue("VirtualDestination.QueueConsumer"), new ActiveMQTopic("VirtualDestination.TopicConsumer"))); javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{queue}); TimeUnit.SECONDS.sleep(SLEEP); exerciseCompositeQueue("VirtualDestination.CompositeQueue", "VirtualDestination.QueueConsumer"); } @Test public void testNewCompositeApplyImmediately() throws Exception { startBroker(new BrokerService()); assertTrue("broker alive", brokerService.isStarted()); CompositeQueue queue = buildCompositeQueue("VirtualDestination.CompositeQueue", Arrays.asList(new ActiveMQQueue("VirtualDestination.QueueConsumer"), new ActiveMQTopic("VirtualDestination.TopicConsumer"))); javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{queue}, true); TimeUnit.SECONDS.sleep(SLEEP); exerciseCompositeQueue("VirtualDestination.CompositeQueue", "VirtualDestination.QueueConsumer"); } @Test public void testModComposite() throws Exception { BrokerService brokerService = new BrokerService(); CompositeQueue queue = buildCompositeQueue("VirtualDestination.CompositeQueue", Arrays.asList(new ActiveMQQueue("VirtualDestination.QueueConsumer"), new ActiveMQTopic("VirtualDestination.TopicConsumer"))); brokerService.setDestinationInterceptors(new DestinationInterceptor[] { buildInterceptor(new VirtualDestination[]{queue})}); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); exerciseCompositeQueue("VirtualDestination.CompositeQueue", "VirtualDestination.QueueConsumer"); //Apply updated config CompositeQueue newConfig = buildCompositeQueue("VirtualDestination.CompositeQueue", false, Arrays.asList(new ActiveMQQueue("VirtualDestination.QueueConsumer"), new ActiveMQTopic("VirtualDestination.TopicConsumer"))); javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{newConfig}); TimeUnit.SECONDS.sleep(SLEEP); exerciseCompositeQueue("VirtualDestination.CompositeQueue", "VirtualDestination.QueueConsumer"); exerciseCompositeQueue("VirtualDestination.CompositeQueue", "VirtualDestination.CompositeQueue"); } @Test public void testNewNoDefaultVirtualTopicSupport() throws Exception { BrokerService brokerService = new BrokerService(); brokerService.setUseVirtualTopics(false); startBroker(brokerService); TimeUnit.SECONDS.sleep(SLEEP); assertTrue("broker alive", brokerService.isStarted()); DestinationInterceptor[] interceptors = brokerService.getDestinationInterceptors(); assertEquals("one interceptor", 0, interceptors.length); //apply new config javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("A.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); // update will happen on addDestination exerciseVirtualTopic("A.Default"); interceptors = brokerService.getDestinationInterceptors(); assertEquals("one interceptor", 1, interceptors.length); assertTrue("it is virtual topic interceptor", interceptors[0] instanceof VirtualDestinationInterceptor); //apply new config again, make sure still just 1 interceptor javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("A.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); // update will happen on addDestination exerciseVirtualTopic("A.Default"); interceptors = brokerService.getDestinationInterceptors(); assertEquals("one interceptor", 1, interceptors.length); assertTrue("it is virtual topic interceptor", interceptors[0] instanceof VirtualDestinationInterceptor); } @Test public void testNewWithMirrorQueueSupport() throws Exception { BrokerService brokerService = new BrokerService(); brokerService.setUseMirroredQueues(true); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); TimeUnit.SECONDS.sleep(SLEEP); assertTrue("broker alive", brokerService.isStarted()); DestinationInterceptor[] interceptors = brokerService.getDestinationInterceptors(); assertEquals("expected interceptor", 2, interceptors.length); //apply new config javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("A.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); // update will happen on addDestination exerciseVirtualTopic("A.Default"); interceptors = brokerService.getDestinationInterceptors(); assertEquals("expected interceptor", 2, interceptors.length); assertTrue("it is virtual topic interceptor", interceptors[0] instanceof VirtualDestinationInterceptor); VirtualDestinationInterceptor newValue = (VirtualDestinationInterceptor) interceptors[0]; // apply again - ensure no change javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("A.>", false)}); assertSame("same instance", newValue, brokerService.getDestinationInterceptors()[0]); } @Test public void testRemove() throws Exception { final BrokerService brokerService = new BrokerService(); brokerService.setDestinationInterceptors(new DestinationInterceptor[] { buildInterceptor(new VirtualDestination[]{buildVirtualTopic("A.>", false)})}); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); DestinationInterceptor[] interceptors = brokerService.getDestinationInterceptors(); assertEquals("one interceptor", 1, interceptors.length); assertTrue("it is virtual topic interceptor", interceptors[0] instanceof VirtualDestinationInterceptor); exerciseVirtualTopic("A.Default"); VirtualDestinationInterceptor defaultValue = (VirtualDestinationInterceptor) interceptors[0]; assertEquals("configured names in place", "A.>", defaultValue.getVirtualDestinations()[0].getVirtualDestination().getPhysicalName()); exerciseVirtualTopic("A.Default"); //apply empty config - this removes all virtual destinations from the interceptor javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{}); TimeUnit.SECONDS.sleep(SLEEP); // update will happen on addDestination forceAddDestination("AnyDest"); assertTrue("getVirtualDestinations empty on time", Wait.waitFor(new Wait.Condition() { @Override public boolean isSatisified() { return 0 == ((VirtualDestinationInterceptor)brokerService.getDestinationInterceptors()[0]). getVirtualDestinations().length; } })); // reverse the remove, add again javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("A.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); // update will happen on addDestination exerciseVirtualTopic("A.NewOne"); interceptors = brokerService.getDestinationInterceptors(); assertEquals("expected interceptor", 1, interceptors.length); assertTrue("it is virtual topic interceptor", interceptors[0] instanceof VirtualDestinationInterceptor); } @Test public void testMod() throws Exception { final BrokerService brokerService = new BrokerService(); brokerService.setDestinationInterceptors(new DestinationInterceptor[] { buildInterceptor(new VirtualDestination[]{buildVirtualTopic("A.>", false)})}); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); assertEquals("one interceptor", 1, brokerService.getDestinationInterceptors().length); exerciseVirtualTopic("A.Default"); //apply new config javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("B.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); exerciseVirtualTopic("B.Default"); assertEquals("still one interceptor", 1, brokerService.getDestinationInterceptors().length); } @Test public void testModApplyImmediately() throws Exception { final BrokerService brokerService = new BrokerService(); brokerService.setDestinationInterceptors(new DestinationInterceptor[] { buildInterceptor(new VirtualDestination[]{buildVirtualTopic("A.>", false)})}); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); assertEquals("one interceptor", 1, brokerService.getDestinationInterceptors().length); exerciseVirtualTopic("A.Default"); //apply new config javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("B.>", false)}, true); TimeUnit.SECONDS.sleep(SLEEP); exerciseVirtualTopic("B.Default"); assertEquals("still one interceptor", 1, brokerService.getDestinationInterceptors().length); } @Test public void testModWithMirroredQueue() throws Exception { final BrokerService brokerService = new BrokerService(); brokerService.setUseMirroredQueues(true); brokerService.setDestinationInterceptors(new DestinationInterceptor[] { buildInterceptor(new VirtualDestination[]{buildVirtualTopic("A.>", false)})}); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); TimeUnit.SECONDS.sleep(SLEEP); assertEquals("one interceptor", 1, brokerService.getDestinationInterceptors().length); exerciseVirtualTopic("A.Default"); //apply new config javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{buildVirtualTopic("B.>", false)}); TimeUnit.SECONDS.sleep(SLEEP); exerciseVirtualTopic("B.Default"); assertEquals("still one interceptor", 1, brokerService.getDestinationInterceptors().length); } @Test public void testNewFilteredComposite() throws Exception { final BrokerService brokerService = new BrokerService(); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); FilteredDestination filteredDestination = new FilteredDestination(); filteredDestination.setSelector("odd = 'yes'"); filteredDestination.setQueue("VirtualDestination.QueueConsumer"); CompositeQueue queue = buildCompositeQueue("VirtualDestination.FilteredCompositeQueue", Arrays.asList(filteredDestination)); //apply new config javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{queue}); TimeUnit.SECONDS.sleep(SLEEP); exerciseFilteredCompositeQueue("VirtualDestination.FilteredCompositeQueue", "VirtualDestination.QueueConsumer", "yes"); } @Test public void testModFilteredComposite() throws Exception { final BrokerService brokerService = new BrokerService(); FilteredDestination filteredDestination = new FilteredDestination(); filteredDestination.setSelector("odd = 'yes'"); filteredDestination.setQueue("VirtualDestination.QueueConsumer"); CompositeQueue queue = buildCompositeQueue("VirtualDestination.FilteredCompositeQueue", Arrays.asList(filteredDestination)); brokerService.setDestinationInterceptors(new DestinationInterceptor[] { buildInterceptor(new VirtualDestination[]{queue})}); startBroker(brokerService); assertTrue("broker alive", brokerService.isStarted()); exerciseFilteredCompositeQueue("VirtualDestination.FilteredCompositeQueue", "VirtualDestination.QueueConsumer", "yes"); filteredDestination = new FilteredDestination(); filteredDestination.setSelector("odd = 'no'"); filteredDestination.setQueue("VirtualDestination.QueueConsumer"); queue = buildCompositeQueue("VirtualDestination.FilteredCompositeQueue", Arrays.asList(filteredDestination)); //apply new config javaConfigBroker.setVirtualDestinations(new VirtualDestination[]{queue}); TimeUnit.SECONDS.sleep(SLEEP); exerciseFilteredCompositeQueue("VirtualDestination.FilteredCompositeQueue", "VirtualDestination.QueueConsumer", "no"); exerciseFilteredCompositeQueue("VirtualDestination.FilteredCompositeQueue", "VirtualDestination.QueueConsumer", "no"); } protected static CompositeQueue buildCompositeQueue(String name, Collection<?> forwardTo) { return buildCompositeQueue(name, true, forwardTo); } protected static CompositeQueue buildCompositeQueue(String name, boolean forwardOnly, Collection<?> forwardTo) { CompositeQueue queue = new CompositeQueue(); queue.setForwardOnly(forwardOnly); queue.setName(name); queue.setForwardTo(forwardTo); return queue; } protected static VirtualTopic buildVirtualTopic(String name, boolean selectorAware) { VirtualTopic virtualTopic = new VirtualTopic(); virtualTopic.setSelectorAware(selectorAware); virtualTopic.setName(name); return virtualTopic; } protected static VirtualDestinationInterceptor buildInterceptor(VirtualDestination[] virtualDestinations) { VirtualDestinationInterceptor virtualDestinationInterceptor = new VirtualDestinationInterceptor(); virtualDestinationInterceptor.setVirtualDestinations(virtualDestinations); return virtualDestinationInterceptor; } }