/* * 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.artemis.tests.integration.management; import javax.json.JsonArray; import javax.json.JsonObject; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.UUID; import org.apache.activemq.artemis.api.core.JsonUtil; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.TransportConfiguration; import org.apache.activemq.artemis.api.core.client.ActiveMQClient; import org.apache.activemq.artemis.api.core.client.ClientConsumer; import org.apache.activemq.artemis.api.core.client.ClientMessage; import org.apache.activemq.artemis.api.core.client.ClientProducer; import org.apache.activemq.artemis.api.core.client.ClientSession; import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; import org.apache.activemq.artemis.api.core.client.ServerLocator; import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl; import org.apache.activemq.artemis.api.core.management.AddressControl; import org.apache.activemq.artemis.api.core.management.AddressSettingsInfo; import org.apache.activemq.artemis.api.core.management.BridgeControl; import org.apache.activemq.artemis.api.core.management.DivertControl; import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder; import org.apache.activemq.artemis.api.core.management.QueueControl; import org.apache.activemq.artemis.api.core.management.RoleInfo; import org.apache.activemq.artemis.core.client.impl.ClientSessionImpl; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration; import org.apache.activemq.artemis.core.messagecounter.impl.MessageCounterManagerImpl; import org.apache.activemq.artemis.core.remoting.impl.invm.InVMAcceptorFactory; import org.apache.activemq.artemis.core.remoting.impl.invm.TransportConstants; import org.apache.activemq.artemis.core.security.Role; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.ActiveMQServers; import org.apache.activemq.artemis.core.server.Queue; import org.apache.activemq.artemis.api.core.RoutingType; import org.apache.activemq.artemis.core.server.impl.AddressInfo; import org.apache.activemq.artemis.core.settings.impl.SlowConsumerPolicy; import org.apache.activemq.artemis.core.transaction.impl.XidImpl; import org.apache.activemq.artemis.jlibaio.LibaioContext; import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager; import org.apache.activemq.artemis.spi.core.security.jaas.InVMLoginModule; import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger; import org.apache.activemq.artemis.tests.unit.core.config.impl.fakes.FakeConnectorServiceFactory; import org.apache.activemq.artemis.tests.util.Wait; import org.apache.activemq.artemis.utils.RandomUtil; import org.apache.activemq.artemis.utils.UUIDGenerator; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class ActiveMQServerControlTest extends ManagementTestBase { // Constants ----------------------------------------------------- // Attributes ---------------------------------------------------- private ActiveMQServer server; private Configuration conf; private TransportConfiguration connectorConfig; // Static -------------------------------------------------------- private static boolean contains(final String name, final String[] strings) { boolean found = false; for (String str : strings) { IntegrationTestLogger.LOGGER.info("Does " + str + " match " + name); if (name.equals(str)) { found = true; break; } } return found; } // Constructors -------------------------------------------------- // Public -------------------------------------------------------- public boolean usingCore() { return false; } @Test public void testGetAttributes() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); Assert.assertEquals(server.getVersion().getFullVersion(), serverControl.getVersion()); Assert.assertEquals(conf.isClustered(), serverControl.isClustered()); Assert.assertEquals(conf.isPersistDeliveryCountBeforeDelivery(), serverControl.isPersistDeliveryCountBeforeDelivery()); Assert.assertEquals(conf.getScheduledThreadPoolMaxSize(), serverControl.getScheduledThreadPoolMaxSize()); Assert.assertEquals(conf.getThreadPoolMaxSize(), serverControl.getThreadPoolMaxSize()); Assert.assertEquals(conf.getSecurityInvalidationInterval(), serverControl.getSecurityInvalidationInterval()); Assert.assertEquals(conf.isSecurityEnabled(), serverControl.isSecurityEnabled()); Assert.assertEquals(conf.isAsyncConnectionExecutionEnabled(), serverControl.isAsyncConnectionExecutionEnabled()); Assert.assertEquals(conf.getIncomingInterceptorClassNames().size(), serverControl.getIncomingInterceptorClassNames().length); Assert.assertEquals(conf.getIncomingInterceptorClassNames().size(), serverControl.getIncomingInterceptorClassNames().length); Assert.assertEquals(conf.getOutgoingInterceptorClassNames().size(), serverControl.getOutgoingInterceptorClassNames().length); Assert.assertEquals(conf.getConnectionTTLOverride(), serverControl.getConnectionTTLOverride()); //Assert.assertEquals(conf.getBackupConnectorName(), serverControl.getBackupConnectorName()); Assert.assertEquals(conf.getManagementAddress().toString(), serverControl.getManagementAddress()); Assert.assertEquals(conf.getManagementNotificationAddress().toString(), serverControl.getManagementNotificationAddress()); Assert.assertEquals(conf.getIDCacheSize(), serverControl.getIDCacheSize()); Assert.assertEquals(conf.isPersistIDCache(), serverControl.isPersistIDCache()); Assert.assertEquals(conf.getBindingsDirectory(), serverControl.getBindingsDirectory()); Assert.assertEquals(conf.getJournalDirectory(), serverControl.getJournalDirectory()); Assert.assertEquals(conf.getJournalType().toString(), serverControl.getJournalType()); Assert.assertEquals(conf.isJournalSyncTransactional(), serverControl.isJournalSyncTransactional()); Assert.assertEquals(conf.isJournalSyncNonTransactional(), serverControl.isJournalSyncNonTransactional()); Assert.assertEquals(conf.getJournalFileSize(), serverControl.getJournalFileSize()); Assert.assertEquals(conf.getJournalMinFiles(), serverControl.getJournalMinFiles()); if (LibaioContext.isLoaded()) { Assert.assertEquals(conf.getJournalMaxIO_AIO(), serverControl.getJournalMaxIO()); Assert.assertEquals(conf.getJournalBufferSize_AIO(), serverControl.getJournalBufferSize()); Assert.assertEquals(conf.getJournalBufferTimeout_AIO(), serverControl.getJournalBufferTimeout()); } Assert.assertEquals(conf.isCreateBindingsDir(), serverControl.isCreateBindingsDir()); Assert.assertEquals(conf.isCreateJournalDir(), serverControl.isCreateJournalDir()); Assert.assertEquals(conf.getPagingDirectory(), serverControl.getPagingDirectory()); Assert.assertEquals(conf.getLargeMessagesDirectory(), serverControl.getLargeMessagesDirectory()); Assert.assertEquals(conf.isWildcardRoutingEnabled(), serverControl.isWildcardRoutingEnabled()); Assert.assertEquals(conf.getTransactionTimeout(), serverControl.getTransactionTimeout()); Assert.assertEquals(conf.isMessageCounterEnabled(), serverControl.isMessageCounterEnabled()); Assert.assertEquals(conf.getTransactionTimeoutScanPeriod(), serverControl.getTransactionTimeoutScanPeriod()); Assert.assertEquals(conf.getMessageExpiryScanPeriod(), serverControl.getMessageExpiryScanPeriod()); Assert.assertEquals(conf.getMessageExpiryThreadPriority(), serverControl.getMessageExpiryThreadPriority()); Assert.assertEquals(conf.getJournalCompactMinFiles(), serverControl.getJournalCompactMinFiles()); Assert.assertEquals(conf.getJournalCompactPercentage(), serverControl.getJournalCompactPercentage()); Assert.assertEquals(conf.isPersistenceEnabled(), serverControl.isPersistenceEnabled()); } @Test public void testGetConnectors() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); Object[] connectorData = serverControl.getConnectors(); Assert.assertNotNull(connectorData); Assert.assertEquals(1, connectorData.length); Object[] config = (Object[]) connectorData[0]; Assert.assertEquals(connectorConfig.getName(), config[0]); } @Test public void testGetConnectorsAsJSON() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); String jsonString = serverControl.getConnectorsAsJSON(); Assert.assertNotNull(jsonString); JsonArray array = JsonUtil.readJsonArray(jsonString); Assert.assertEquals(1, array.size()); JsonObject data = array.getJsonObject(0); Assert.assertEquals(connectorConfig.getName(), data.getString("name")); Assert.assertEquals(connectorConfig.getFactoryClassName(), data.getString("factoryClassName")); Assert.assertEquals(connectorConfig.getParams().size(), data.getJsonObject("params").size()); } @Test public void testCreateAndDestroyQueue() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.createAddress(address.toString(), "ANYCAST"); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), null, true, -1, false, false); checkResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); QueueControl queueControl = ManagementControlHelper.createQueueControl(address, name, RoutingType.ANYCAST, mbeanServer); Assert.assertEquals(address.toString(), queueControl.getAddress()); Assert.assertEquals(name.toString(), queueControl.getName()); Assert.assertNull(queueControl.getFilter()); Assert.assertEquals(true, queueControl.isDurable()); Assert.assertEquals(false, queueControl.isTemporary()); serverControl.destroyQueue(name.toString()); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); } @Test public void testCreateAndDestroyQueue_2() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); String filter = "color = 'green'"; boolean durable = true; ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.createAddress(address.toString(), "ANYCAST"); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), filter, durable, -1, false, false); checkResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); QueueControl queueControl = ManagementControlHelper.createQueueControl(address, name, RoutingType.ANYCAST, mbeanServer); Assert.assertEquals(address.toString(), queueControl.getAddress()); Assert.assertEquals(name.toString(), queueControl.getName()); Assert.assertEquals(filter, queueControl.getFilter()); Assert.assertEquals(durable, queueControl.isDurable()); Assert.assertEquals(false, queueControl.isTemporary()); serverControl.destroyQueue(name.toString()); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); } @Test public void testCreateAndDestroyQueue_3() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); boolean durable = true; ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.createAddress(address.toString(), "ANYCAST"); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), null, durable, -1, false, false); checkResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); QueueControl queueControl = ManagementControlHelper.createQueueControl(address, name, RoutingType.ANYCAST, mbeanServer); Assert.assertEquals(address.toString(), queueControl.getAddress()); Assert.assertEquals(name.toString(), queueControl.getName()); Assert.assertNull(queueControl.getFilter()); Assert.assertEquals(durable, queueControl.isDurable()); Assert.assertEquals(false, queueControl.isTemporary()); serverControl.destroyQueue(name.toString()); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); } @Test public void testCreateAndDestroyQueue_4() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); boolean durable = RandomUtil.randomBoolean(); boolean purgeOnNoConsumers = RandomUtil.randomBoolean(); boolean autoCreateAddress = true; int maxConsumers = RandomUtil.randomInt(); ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.createQueue(address.toString(), RoutingType.ANYCAST.toString(), name.toString(), null, durable, maxConsumers, purgeOnNoConsumers, autoCreateAddress); checkResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); QueueControl queueControl = ManagementControlHelper.createQueueControl(address, name, RoutingType.ANYCAST, mbeanServer); Assert.assertEquals(address.toString(), queueControl.getAddress()); Assert.assertEquals(name.toString(), queueControl.getName()); Assert.assertNull(queueControl.getFilter()); Assert.assertEquals(durable, queueControl.isDurable()); Assert.assertEquals(purgeOnNoConsumers, queueControl.isPurgeOnNoConsumers()); Assert.assertEquals(maxConsumers, queueControl.getMaxConsumers()); Assert.assertEquals(false, queueControl.isTemporary()); checkResource(ObjectNameBuilder.DEFAULT.getAddressObjectName(address)); AddressControl addressControl = ManagementControlHelper.createAddressControl(address, mbeanServer); Assert.assertEquals(address.toString(), addressControl.getAddress()); serverControl.destroyQueue(name.toString(), true, true); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); checkNoResource(ObjectNameBuilder.DEFAULT.getAddressObjectName(address)); } @Test public void testCreateAndDestroyQueueClosingConsumers() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); boolean durable = true; ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.createAddress(address.toString(), "ANYCAST"); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), null, durable, -1, false, false); ServerLocator receiveLocator = createInVMNonHALocator(); ClientSessionFactory receiveCsf = createSessionFactory(receiveLocator); ClientSession receiveClientSession = receiveCsf.createSession(true, false, false); final ClientConsumer consumer = receiveClientSession.createConsumer(name); Assert.assertFalse(consumer.isClosed()); checkResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.destroyQueue(name.toString(), true); Wait.waitFor(new Wait.Condition() { @Override public boolean isSatisfied() throws Exception { return consumer.isClosed(); } }, 1000, 100); Assert.assertTrue(consumer.isClosed()); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); } @Test public void testCreateAndDestroyQueueWithNullFilter() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); String filter = null; boolean durable = true; ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.createAddress(address.toString(), "ANYCAST"); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), filter, durable, -1, false, false); checkResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); QueueControl queueControl = ManagementControlHelper.createQueueControl(address, name, RoutingType.ANYCAST, mbeanServer); Assert.assertEquals(address.toString(), queueControl.getAddress()); Assert.assertEquals(name.toString(), queueControl.getName()); Assert.assertNull(queueControl.getFilter()); Assert.assertEquals(durable, queueControl.isDurable()); Assert.assertEquals(false, queueControl.isTemporary()); serverControl.destroyQueue(name.toString()); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); } @Test public void testCreateAndDestroyQueueWithEmptyStringForFilter() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); String filter = ""; boolean durable = true; ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); serverControl.createAddress(address.toString(), "ANYCAST"); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), filter, durable, -1, false, false); checkResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); QueueControl queueControl = ManagementControlHelper.createQueueControl(address, name, RoutingType.ANYCAST, mbeanServer); Assert.assertEquals(address.toString(), queueControl.getAddress()); Assert.assertEquals(name.toString(), queueControl.getName()); Assert.assertNull(queueControl.getFilter()); Assert.assertEquals(durable, queueControl.isDurable()); Assert.assertEquals(false, queueControl.isTemporary()); serverControl.destroyQueue(name.toString()); checkNoResource(ObjectNameBuilder.DEFAULT.getQueueObjectName(address, name, RoutingType.ANYCAST)); } @Test public void testGetQueueNames() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); ActiveMQServerControl serverControl = createManagementControl(); // due to replication, there can be another queue created for replicating // management operations Assert.assertFalse(ActiveMQServerControlTest.contains(name.toString(), serverControl.getQueueNames())); serverControl.createAddress(address.toString(), "ANYCAST"); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), null, true, -1, false, false); Assert.assertTrue(ActiveMQServerControlTest.contains(name.toString(), serverControl.getQueueNames())); serverControl.destroyQueue(name.toString()); Assert.assertFalse(ActiveMQServerControlTest.contains(name.toString(), serverControl.getQueueNames())); } @Test public void testGetQueueNamesWithRoutingType() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString anycastName = RandomUtil.randomSimpleString(); SimpleString multicastName = RandomUtil.randomSimpleString(); ActiveMQServerControl serverControl = createManagementControl(); // due to replication, there can be another queue created for replicating // management operations Assert.assertFalse(ActiveMQServerControlTest.contains(anycastName.toString(), serverControl.getQueueNames())); Assert.assertFalse(ActiveMQServerControlTest.contains(multicastName.toString(), serverControl.getQueueNames())); serverControl.createQueue(address.toString(), RoutingType.ANYCAST.toString(), anycastName.toString(), null, true, -1, false, true); Assert.assertTrue(ActiveMQServerControlTest.contains(anycastName.toString(), serverControl.getQueueNames(RoutingType.ANYCAST.toString()))); Assert.assertFalse(ActiveMQServerControlTest.contains(anycastName.toString(), serverControl.getQueueNames(RoutingType.MULTICAST.toString()))); serverControl.createQueue(address.toString(), RoutingType.MULTICAST.toString(), multicastName.toString(), null, true, -1, false, true); Assert.assertTrue(ActiveMQServerControlTest.contains(multicastName.toString(), serverControl.getQueueNames(RoutingType.MULTICAST.toString()))); Assert.assertFalse(ActiveMQServerControlTest.contains(multicastName.toString(), serverControl.getQueueNames(RoutingType.ANYCAST.toString()))); serverControl.destroyQueue(anycastName.toString()); serverControl.destroyQueue(multicastName.toString()); Assert.assertFalse(ActiveMQServerControlTest.contains(anycastName.toString(), serverControl.getQueueNames())); Assert.assertFalse(ActiveMQServerControlTest.contains(multicastName.toString(), serverControl.getQueueNames())); } @Test public void testGetAddressNames() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); ActiveMQServerControl serverControl = createManagementControl(); // due to replication, there can be another queue created for replicating // management operations Assert.assertFalse(ActiveMQServerControlTest.contains(address.toString(), serverControl.getAddressNames())); serverControl.createQueue(address.toString(), "ANYCAST", name.toString(), null, true, -1, false, true); Assert.assertTrue(ActiveMQServerControlTest.contains(address.toString(), serverControl.getAddressNames())); serverControl.destroyQueue(name.toString(), true, true); Assert.assertFalse(ActiveMQServerControlTest.contains(address.toString(), serverControl.getAddressNames())); } @Test public void testGetAddressDeletedFromJournal() throws Exception { SimpleString address = RandomUtil.randomSimpleString(); SimpleString name = RandomUtil.randomSimpleString(); ActiveMQServerControl serverControl = createManagementControl(); // due to replication, there can be another queue created for replicating // management operations Assert.assertFalse(ActiveMQServerControlTest.contains(address.toString(), serverControl.getAddressNames())); serverControl.createAddress(address.toString(), "ANYCAST"); Assert.assertTrue(ActiveMQServerControlTest.contains(address.toString(), serverControl.getAddressNames())); restartServer(); serverControl.deleteAddress(address.toString()); restartServer(); Assert.assertFalse(ActiveMQServerControlTest.contains(address.toString(), serverControl.getAddressNames())); } @Test public void testMessageCounterMaxDayCount() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); Assert.assertEquals(MessageCounterManagerImpl.DEFAULT_MAX_DAY_COUNT, serverControl.getMessageCounterMaxDayCount()); int newCount = 100; serverControl.setMessageCounterMaxDayCount(newCount); Assert.assertEquals(newCount, serverControl.getMessageCounterMaxDayCount()); try { serverControl.setMessageCounterMaxDayCount(-1); Assert.fail(); } catch (Exception e) { } try { serverControl.setMessageCounterMaxDayCount(0); Assert.fail(); } catch (Exception e) { } Assert.assertEquals(newCount, serverControl.getMessageCounterMaxDayCount()); } @Test public void testGetMessageCounterSamplePeriod() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); Assert.assertEquals(MessageCounterManagerImpl.DEFAULT_SAMPLE_PERIOD, serverControl.getMessageCounterSamplePeriod()); long newSample = 20000; serverControl.setMessageCounterSamplePeriod(newSample); Assert.assertEquals(newSample, serverControl.getMessageCounterSamplePeriod()); try { serverControl.setMessageCounterSamplePeriod(-1); Assert.fail(); } catch (Exception e) { } try { serverControl.setMessageCounterSamplePeriod(0); Assert.fail(); } catch (Exception e) { } //this only gets warning now and won't cause exception. serverControl.setMessageCounterSamplePeriod(MessageCounterManagerImpl.MIN_SAMPLE_PERIOD - 1); Assert.assertEquals(MessageCounterManagerImpl.MIN_SAMPLE_PERIOD - 1, serverControl.getMessageCounterSamplePeriod()); } protected void restartServer() throws Exception { server.stop(); server.start(); } @Test public void testSecuritySettings() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); String addressMatch = "test.#"; String exactAddress = "test.whatever"; assertEquals(1, serverControl.getRoles(addressMatch).length); serverControl.addSecuritySettings(addressMatch, "foo", "foo, bar", "foo", "bar", "foo, bar", "", "", "bar", "foo", "foo"); // Restart the server. Those settings should be persisted restartServer(); serverControl = createManagementControl(); String rolesAsJSON = serverControl.getRolesAsJSON(exactAddress); RoleInfo[] roleInfos = RoleInfo.from(rolesAsJSON); assertEquals(2, roleInfos.length); RoleInfo fooRole = null; RoleInfo barRole = null; if (roleInfos[0].getName().equals("foo")) { fooRole = roleInfos[0]; barRole = roleInfos[1]; } else { fooRole = roleInfos[1]; barRole = roleInfos[0]; } assertTrue(fooRole.isSend()); assertTrue(fooRole.isConsume()); assertTrue(fooRole.isCreateDurableQueue()); assertFalse(fooRole.isDeleteDurableQueue()); assertTrue(fooRole.isCreateNonDurableQueue()); assertFalse(fooRole.isDeleteNonDurableQueue()); assertFalse(fooRole.isManage()); assertFalse(fooRole.isBrowse()); assertTrue(fooRole.isCreateAddress()); assertFalse(barRole.isSend()); assertTrue(barRole.isConsume()); assertFalse(barRole.isCreateDurableQueue()); assertTrue(barRole.isDeleteDurableQueue()); assertTrue(barRole.isCreateNonDurableQueue()); assertFalse(barRole.isDeleteNonDurableQueue()); assertFalse(barRole.isManage()); assertTrue(barRole.isBrowse()); assertFalse(barRole.isCreateAddress()); serverControl.removeSecuritySettings(addressMatch); assertEquals(1, serverControl.getRoles(exactAddress).length); } @Test public void testAddressSettings() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); String addressMatch = "test.#"; String exactAddress = "test.whatever"; String DLA = "someDLA"; String expiryAddress = "someExpiry"; long expiryDelay = -1; boolean lastValueQueue = true; int deliveryAttempts = 1; long maxSizeBytes = 20; int pageSizeBytes = 10; int pageMaxCacheSize = 7; long redeliveryDelay = 4; double redeliveryMultiplier = 1; long maxRedeliveryDelay = 1000; long redistributionDelay = 5; boolean sendToDLAOnNoRoute = true; String addressFullMessagePolicy = "PAGE"; long slowConsumerThreshold = 5; long slowConsumerCheckPeriod = 10; String slowConsumerPolicy = SlowConsumerPolicy.KILL.toString(); boolean autoCreateJmsQueues = false; boolean autoDeleteJmsQueues = false; boolean autoCreateJmsTopics = false; boolean autoDeleteJmsTopics = false; serverControl.addAddressSettings(addressMatch, DLA, expiryAddress, expiryDelay, lastValueQueue, deliveryAttempts, maxSizeBytes, pageSizeBytes, pageMaxCacheSize, redeliveryDelay, redeliveryMultiplier, maxRedeliveryDelay, redistributionDelay, sendToDLAOnNoRoute, addressFullMessagePolicy, slowConsumerThreshold, slowConsumerCheckPeriod, slowConsumerPolicy, autoCreateJmsQueues, autoDeleteJmsQueues, autoCreateJmsTopics, autoDeleteJmsTopics); boolean ex = false; try { serverControl.addAddressSettings(addressMatch, DLA, expiryAddress, expiryDelay, lastValueQueue, deliveryAttempts, 100, 1000, pageMaxCacheSize, redeliveryDelay, redeliveryMultiplier, maxRedeliveryDelay, redistributionDelay, sendToDLAOnNoRoute, addressFullMessagePolicy, slowConsumerThreshold, slowConsumerCheckPeriod, slowConsumerPolicy, autoCreateJmsQueues, autoDeleteJmsQueues, autoCreateJmsTopics, autoDeleteJmsTopics); } catch (Exception expected) { ex = true; } assertTrue("Exception expected", ex); //restartServer(); serverControl = createManagementControl(); String jsonString = serverControl.getAddressSettingsAsJSON(exactAddress); AddressSettingsInfo info = AddressSettingsInfo.from(jsonString); assertEquals(DLA, info.getDeadLetterAddress()); assertEquals(expiryAddress, info.getExpiryAddress()); assertEquals(lastValueQueue, info.isLastValueQueue()); assertEquals(deliveryAttempts, info.getMaxDeliveryAttempts()); assertEquals(maxSizeBytes, info.getMaxSizeBytes()); assertEquals(pageMaxCacheSize, info.getPageCacheMaxSize()); assertEquals(pageSizeBytes, info.getPageSizeBytes()); assertEquals(redeliveryDelay, info.getRedeliveryDelay()); assertEquals(redeliveryMultiplier, info.getRedeliveryMultiplier(), 0.000001); assertEquals(maxRedeliveryDelay, info.getMaxRedeliveryDelay()); assertEquals(redistributionDelay, info.getRedistributionDelay()); assertEquals(sendToDLAOnNoRoute, info.isSendToDLAOnNoRoute()); assertEquals(addressFullMessagePolicy, info.getAddressFullMessagePolicy()); assertEquals(slowConsumerThreshold, info.getSlowConsumerThreshold()); assertEquals(slowConsumerCheckPeriod, info.getSlowConsumerCheckPeriod()); assertEquals(slowConsumerPolicy, info.getSlowConsumerPolicy()); assertEquals(autoCreateJmsQueues, info.isAutoCreateJmsQueues()); assertEquals(autoDeleteJmsQueues, info.isAutoDeleteJmsQueues()); // assertEquals(autoCreateJmsTopics, info.isAutoCreateAddresses()); assertEquals(autoDeleteJmsTopics, info.isAutoDeleteJmsTopics()); serverControl.addAddressSettings(addressMatch, DLA, expiryAddress, expiryDelay, lastValueQueue, deliveryAttempts, -1, 1000, pageMaxCacheSize, redeliveryDelay, redeliveryMultiplier, maxRedeliveryDelay, redistributionDelay, sendToDLAOnNoRoute, addressFullMessagePolicy, slowConsumerThreshold, slowConsumerCheckPeriod, slowConsumerPolicy, autoCreateJmsQueues, autoDeleteJmsQueues, autoCreateJmsTopics, autoDeleteJmsTopics); jsonString = serverControl.getAddressSettingsAsJSON(exactAddress); info = AddressSettingsInfo.from(jsonString); assertEquals(DLA, info.getDeadLetterAddress()); assertEquals(expiryAddress, info.getExpiryAddress()); assertEquals(lastValueQueue, info.isLastValueQueue()); assertEquals(deliveryAttempts, info.getMaxDeliveryAttempts()); assertEquals(-1, info.getMaxSizeBytes()); assertEquals(pageMaxCacheSize, info.getPageCacheMaxSize()); assertEquals(1000, info.getPageSizeBytes()); assertEquals(redeliveryDelay, info.getRedeliveryDelay()); assertEquals(redeliveryMultiplier, info.getRedeliveryMultiplier(), 0.000001); assertEquals(maxRedeliveryDelay, info.getMaxRedeliveryDelay()); assertEquals(redistributionDelay, info.getRedistributionDelay()); assertEquals(sendToDLAOnNoRoute, info.isSendToDLAOnNoRoute()); assertEquals(addressFullMessagePolicy, info.getAddressFullMessagePolicy()); assertEquals(slowConsumerThreshold, info.getSlowConsumerThreshold()); assertEquals(slowConsumerCheckPeriod, info.getSlowConsumerCheckPeriod()); assertEquals(slowConsumerPolicy, info.getSlowConsumerPolicy()); assertEquals(autoCreateJmsQueues, info.isAutoCreateJmsQueues()); assertEquals(autoDeleteJmsQueues, info.isAutoDeleteJmsQueues()); // assertEquals(autoCreateJmsTopics, info.isAutoCreateAddresses()); assertEquals(autoDeleteJmsTopics, info.isAutoDeleteJmsTopics()); ex = false; try { serverControl.addAddressSettings(addressMatch, DLA, expiryAddress, expiryDelay, lastValueQueue, deliveryAttempts, -2, 1000, pageMaxCacheSize, redeliveryDelay, redeliveryMultiplier, maxRedeliveryDelay, redistributionDelay, sendToDLAOnNoRoute, addressFullMessagePolicy, slowConsumerThreshold, slowConsumerCheckPeriod, slowConsumerPolicy, autoCreateJmsQueues, autoDeleteJmsQueues, autoCreateJmsTopics, autoDeleteJmsTopics); } catch (Exception e) { ex = true; } assertTrue("Supposed to have an exception called", ex); } @Test public void testNullRouteNameOnDivert() throws Exception { String address = RandomUtil.randomString(); String name = RandomUtil.randomString(); String forwardingAddress = RandomUtil.randomString(); ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, address)); assertEquals(0, serverControl.getDivertNames().length); serverControl.createDivert(name.toString(), null, address, forwardingAddress, true, null, null); checkResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, address)); } @Test public void testCreateAndDestroyDivert() throws Exception { String address = RandomUtil.randomString(); String name = RandomUtil.randomString(); String routingName = RandomUtil.randomString(); String forwardingAddress = RandomUtil.randomString(); ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, address)); assertEquals(0, serverControl.getDivertNames().length); serverControl.createDivert(name.toString(), routingName, address, forwardingAddress, true, null, null); checkResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, address)); DivertControl divertControl = ManagementControlHelper.createDivertControl(name.toString(), address, mbeanServer); assertEquals(name.toString(), divertControl.getUniqueName()); assertEquals(address, divertControl.getAddress()); assertEquals(forwardingAddress, divertControl.getForwardingAddress()); assertEquals(routingName, divertControl.getRoutingName()); assertTrue(divertControl.isExclusive()); assertNull(divertControl.getFilter()); assertNull(divertControl.getTransformerClassName()); String[] divertNames = serverControl.getDivertNames(); assertEquals(1, divertNames.length); assertEquals(name, divertNames[0]); // check that a message sent to the address is diverted exclusively ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession session = csf.createSession(); String divertQueue = RandomUtil.randomString(); String queue = RandomUtil.randomString(); session.createQueue(forwardingAddress, RoutingType.ANYCAST, divertQueue); session.createQueue(address, RoutingType.ANYCAST, queue); ClientProducer producer = session.createProducer(address); ClientMessage message = session.createMessage(false); String text = RandomUtil.randomString(); message.putStringProperty("prop", text); producer.send(message); ClientConsumer consumer = session.createConsumer(queue); ClientConsumer divertedConsumer = session.createConsumer(divertQueue); session.start(); assertNull(consumer.receiveImmediate()); message = divertedConsumer.receive(5000); assertNotNull(message); assertEquals(text, message.getStringProperty("prop")); serverControl.destroyDivert(name.toString()); checkNoResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name, address)); assertEquals(0, serverControl.getDivertNames().length); // check that a message is no longer diverted message = session.createMessage(false); String text2 = RandomUtil.randomString(); message.putStringProperty("prop", text2); producer.send(message); assertNull(divertedConsumer.receiveImmediate()); message = consumer.receive(5000); assertNotNull(message); assertEquals(text2, message.getStringProperty("prop")); consumer.close(); divertedConsumer.close(); session.deleteQueue(queue); session.deleteQueue(divertQueue); session.close(); locator.close(); } @Test public void testCreateAndDestroyBridge() throws Exception { String name = RandomUtil.randomString(); String sourceAddress = RandomUtil.randomString(); String sourceQueue = RandomUtil.randomString(); String targetAddress = RandomUtil.randomString(); String targetQueue = RandomUtil.randomString(); ActiveMQServerControl serverControl = createManagementControl(); checkNoResource(ObjectNameBuilder.DEFAULT.getBridgeObjectName(name)); assertEquals(0, serverControl.getBridgeNames().length); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession session = csf.createSession(); session.createQueue(sourceAddress, RoutingType.ANYCAST, sourceQueue); session.createQueue(targetAddress, RoutingType.ANYCAST, targetQueue); serverControl.createBridge(name, sourceQueue, targetAddress, null, // forwardingAddress null, // filterString ActiveMQClient.DEFAULT_RETRY_INTERVAL, ActiveMQClient.DEFAULT_RETRY_INTERVAL_MULTIPLIER, ActiveMQClient.INITIAL_CONNECT_ATTEMPTS, ActiveMQClient.DEFAULT_RECONNECT_ATTEMPTS, false, // duplicateDetection 1, // confirmationWindowSize -1, // producerWindowSize ActiveMQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD, connectorConfig.getName(), // liveConnector false, false, null, null); checkResource(ObjectNameBuilder.DEFAULT.getBridgeObjectName(name)); String[] bridgeNames = serverControl.getBridgeNames(); assertEquals(1, bridgeNames.length); assertEquals(name, bridgeNames[0]); BridgeControl bridgeControl = ManagementControlHelper.createBridgeControl(name, mbeanServer); assertEquals(name, bridgeControl.getName()); assertTrue(bridgeControl.isStarted()); // check that a message sent to the sourceAddress is put in the tagetQueue ClientProducer producer = session.createProducer(sourceAddress); ClientMessage message = session.createMessage(false); String text = RandomUtil.randomString(); message.putStringProperty("prop", text); producer.send(message); session.start(); ClientConsumer targetConsumer = session.createConsumer(targetQueue); message = targetConsumer.receive(5000); assertNotNull(message); assertEquals(text, message.getStringProperty("prop")); ClientConsumer sourceConsumer = session.createConsumer(sourceQueue); assertNull(sourceConsumer.receiveImmediate()); serverControl.destroyBridge(name); checkNoResource(ObjectNameBuilder.DEFAULT.getBridgeObjectName(name)); assertEquals(0, serverControl.getBridgeNames().length); // check that a message is no longer diverted message = session.createMessage(false); String text2 = RandomUtil.randomString(); message.putStringProperty("prop", text2); producer.send(message); assertNull(targetConsumer.receiveImmediate()); message = sourceConsumer.receive(5000); assertNotNull(message); assertEquals(text2, message.getStringProperty("prop")); sourceConsumer.close(); targetConsumer.close(); session.deleteQueue(sourceQueue); session.deleteQueue(targetQueue); session.close(); locator.close(); } @Test public void testListPreparedTransactionDetails() throws Exception { SimpleString atestq = new SimpleString("BasicXaTestq"); Xid xid = newXID(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession clientSession = csf.createSession(true, false, false); clientSession.createQueue(atestq, atestq, null, true); ClientMessage m1 = createTextMessage(clientSession, ""); ClientMessage m2 = createTextMessage(clientSession, ""); ClientMessage m3 = createTextMessage(clientSession, ""); ClientMessage m4 = createTextMessage(clientSession, ""); m1.putStringProperty("m1", "m1"); m2.putStringProperty("m2", "m2"); m3.putStringProperty("m3", "m3"); m4.putStringProperty("m4", "m4"); ClientProducer clientProducer = clientSession.createProducer(atestq); clientSession.start(xid, XAResource.TMNOFLAGS); clientProducer.send(m1); clientProducer.send(m2); clientProducer.send(m3); clientProducer.send(m4); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); ActiveMQServerControl serverControl = createManagementControl(); JsonArray jsonArray = JsonUtil.readJsonArray(serverControl.listProducersInfoAsJSON()); assertEquals(1, jsonArray.size()); assertEquals(4, ((JsonObject) jsonArray.get(0)).getInt("msgSent")); clientSession.close(); locator.close(); String txDetails = serverControl.listPreparedTransactionDetailsAsJSON(); Assert.assertTrue(txDetails.matches(".*m1.*")); Assert.assertTrue(txDetails.matches(".*m2.*")); Assert.assertTrue(txDetails.matches(".*m3.*")); Assert.assertTrue(txDetails.matches(".*m4.*")); } @Test public void testListPreparedTransactionDetailsAsHTML() throws Exception { SimpleString atestq = new SimpleString("BasicXaTestq"); Xid xid = newXID(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession clientSession = csf.createSession(true, false, false); clientSession.createQueue(atestq, atestq, null, true); ClientMessage m1 = createTextMessage(clientSession, ""); ClientMessage m2 = createTextMessage(clientSession, ""); ClientMessage m3 = createTextMessage(clientSession, ""); ClientMessage m4 = createTextMessage(clientSession, ""); m1.putStringProperty("m1", "m1"); m2.putStringProperty("m2", "m2"); m3.putStringProperty("m3", "m3"); m4.putStringProperty("m4", "m4"); ClientProducer clientProducer = clientSession.createProducer(atestq); clientSession.start(xid, XAResource.TMNOFLAGS); clientProducer.send(m1); clientProducer.send(m2); clientProducer.send(m3); clientProducer.send(m4); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); clientSession.close(); locator.close(); ActiveMQServerControl serverControl = createManagementControl(); String html = serverControl.listPreparedTransactionDetailsAsHTML(); Assert.assertTrue(html.matches(".*m1.*")); Assert.assertTrue(html.matches(".*m2.*")); Assert.assertTrue(html.matches(".*m3.*")); Assert.assertTrue(html.matches(".*m4.*")); } @Test public void testCommitPreparedTransactions() throws Exception { SimpleString recQueue = new SimpleString("BasicXaTestqRec"); SimpleString sendQueue = new SimpleString("BasicXaTestqSend"); byte[] globalTransactionId = UUIDGenerator.getInstance().generateStringUUID().getBytes(); Xid xid = new XidImpl("xa1".getBytes(), 1, globalTransactionId); Xid xid2 = new XidImpl("xa2".getBytes(), 1, globalTransactionId); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession clientSession = csf.createSession(true, false, false); clientSession.createQueue(recQueue, recQueue, null, true); clientSession.createQueue(sendQueue, sendQueue, null, true); ClientMessage m1 = createTextMessage(clientSession, ""); m1.putStringProperty("m1", "m1"); ClientProducer clientProducer = clientSession.createProducer(recQueue); clientProducer.send(m1); locator.close(); ServerLocator receiveLocator = createInVMNonHALocator(); ClientSessionFactory receiveCsf = createSessionFactory(receiveLocator); ClientSession receiveClientSession = receiveCsf.createSession(true, false, false); ClientConsumer consumer = receiveClientSession.createConsumer(recQueue); ServerLocator sendLocator = createInVMNonHALocator(); ClientSessionFactory sendCsf = createSessionFactory(sendLocator); ClientSession sendClientSession = sendCsf.createSession(true, false, false); ClientProducer producer = sendClientSession.createProducer(sendQueue); receiveClientSession.start(xid, XAResource.TMNOFLAGS); receiveClientSession.start(); sendClientSession.start(xid2, XAResource.TMNOFLAGS); ClientMessage m = consumer.receive(5000); assertNotNull(m); producer.send(m); receiveClientSession.end(xid, XAResource.TMSUCCESS); sendClientSession.end(xid2, XAResource.TMSUCCESS); receiveClientSession.prepare(xid); sendClientSession.prepare(xid2); ActiveMQServerControl serverControl = createManagementControl(); sendLocator.close(); receiveLocator.close(); boolean success = serverControl.commitPreparedTransaction(XidImpl.toBase64String(xid)); success = serverControl.commitPreparedTransaction(XidImpl.toBase64String(xid)); System.out.println("ActiveMQServerControlTest.testCommitPreparedTransactions"); } @Test public void testScaleDownWithConnector() throws Exception { scaleDown(new ScaleDownHandler() { @Override public void scaleDown(ActiveMQServerControl control) throws Exception { control.scaleDown("server2-connector"); } }); } @Test public void testScaleDownWithOutConnector() throws Exception { scaleDown(new ScaleDownHandler() { @Override public void scaleDown(ActiveMQServerControl control) throws Exception { control.scaleDown(null); } }); } @Test public void testForceFailover() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); try { serverControl.forceFailover(); } catch (Exception e) { if (!usingCore()) { fail(e.getMessage()); } } assertFalse(server.isStarted()); } @Test public void testTotalMessageCount() throws Exception { String random1 = RandomUtil.randomString(); String random2 = RandomUtil.randomString(); ActiveMQServerControl serverControl = createManagementControl(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession session = csf.createSession(); session.createQueue(random1, RoutingType.ANYCAST, random1); session.createQueue(random2, RoutingType.ANYCAST, random2); ClientProducer producer1 = session.createProducer(random1); ClientProducer producer2 = session.createProducer(random2); ClientMessage message = session.createMessage(true); producer1.send(message); producer2.send(message); session.commit(); // flush executors on queues so we can get precise number of messages Queue queue1 = server.locateQueue(SimpleString.toSimpleString(random1)); queue1.flushExecutor(); Queue queue2 = server.locateQueue(SimpleString.toSimpleString(random1)); queue2.flushExecutor(); assertEquals(2, serverControl.getTotalMessageCount()); session.deleteQueue(random1); session.deleteQueue(random2); session.close(); locator.close(); } @Test public void testTotalConnectionCount() throws Exception { final int CONNECTION_COUNT = 100; ActiveMQServerControl serverControl = createManagementControl(); ServerLocator locator = createInVMNonHALocator(); for (int i = 0; i < CONNECTION_COUNT; i++) { createSessionFactory(locator).close(); } assertEquals(CONNECTION_COUNT + (usingCore() ? 1 : 0), serverControl.getTotalConnectionCount()); assertEquals((usingCore() ? 1 : 0), serverControl.getConnectionCount()); locator.close(); } @Test public void testTotalMessagesAdded() throws Exception { String random1 = RandomUtil.randomString(); String random2 = RandomUtil.randomString(); ActiveMQServerControl serverControl = createManagementControl(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession session = csf.createSession(); session.createQueue(random1, RoutingType.ANYCAST, random1); session.createQueue(random2, RoutingType.ANYCAST, random2); ClientProducer producer1 = session.createProducer(random1); ClientProducer producer2 = session.createProducer(random2); ClientMessage message = session.createMessage(false); producer1.send(message); producer2.send(message); session.commit(); ClientConsumer consumer1 = session.createConsumer(random1); ClientConsumer consumer2 = session.createConsumer(random2); session.start(); assertNotNull(consumer1.receive().acknowledge()); assertNotNull(consumer2.receive().acknowledge()); session.commit(); assertEquals(2, serverControl.getTotalMessagesAdded()); assertEquals(0, serverControl.getTotalMessageCount()); consumer1.close(); consumer2.close(); session.deleteQueue(random1); session.deleteQueue(random2); session.close(); locator.close(); } @Test public void testTotalMessagesAcknowledged() throws Exception { String random1 = RandomUtil.randomString(); String random2 = RandomUtil.randomString(); ActiveMQServerControl serverControl = createManagementControl(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession session = csf.createSession(); session.createQueue(random1, RoutingType.ANYCAST, random1); session.createQueue(random2, RoutingType.ANYCAST, random2); ClientProducer producer1 = session.createProducer(random1); ClientProducer producer2 = session.createProducer(random2); ClientMessage message = session.createMessage(false); producer1.send(message); producer2.send(message); session.commit(); ClientConsumer consumer1 = session.createConsumer(random1); ClientConsumer consumer2 = session.createConsumer(random2); session.start(); assertNotNull(consumer1.receive().acknowledge()); assertNotNull(consumer2.receive().acknowledge()); session.commit(); assertEquals(2, serverControl.getTotalMessagesAcknowledged()); assertEquals(0, serverControl.getTotalMessageCount()); consumer1.close(); consumer2.close(); session.deleteQueue(random1); session.deleteQueue(random2); session.close(); locator.close(); } @Test public void testTotalConsumerCount() throws Exception { String random1 = RandomUtil.randomString(); String random2 = RandomUtil.randomString(); ActiveMQServerControl serverControl = createManagementControl(); QueueControl queueControl1 = ManagementControlHelper.createQueueControl(SimpleString.toSimpleString(random1), SimpleString.toSimpleString(random1), RoutingType.ANYCAST, mbeanServer); QueueControl queueControl2 = ManagementControlHelper.createQueueControl(SimpleString.toSimpleString(random2), SimpleString.toSimpleString(random2), RoutingType.ANYCAST, mbeanServer); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession session = csf.createSession(); session.createQueue(random1, RoutingType.ANYCAST, random1); session.createQueue(random2, RoutingType.ANYCAST, random2); ClientConsumer consumer1 = session.createConsumer(random1); ClientConsumer consumer2 = session.createConsumer(random2); assertEquals(usingCore() ? 3 : 2, serverControl.getTotalConsumerCount()); assertEquals(1, queueControl1.getConsumerCount()); assertEquals(1, queueControl2.getConsumerCount()); consumer1.close(); consumer2.close(); session.deleteQueue(random1); session.deleteQueue(random2); session.close(); locator.close(); } @Test public void testListConnectionsAsJSON() throws Exception { ActiveMQServerControl serverControl = createManagementControl(); List<ClientSessionFactory> factories = new ArrayList<>(); ServerLocator locator = createInVMNonHALocator(); factories.add(createSessionFactory(locator)); Thread.sleep(200); factories.add(createSessionFactory(locator)); addClientSession(factories.get(1).createSession()); String jsonString = serverControl.listConnectionsAsJSON(); IntegrationTestLogger.LOGGER.info(jsonString); Assert.assertNotNull(jsonString); JsonArray array = JsonUtil.readJsonArray(jsonString); Assert.assertEquals(usingCore() ? 3 : 2, array.size()); String key = "creationTime"; JsonObject[] sorted = new JsonObject[array.size()]; for (int i = 0; i < array.size(); i++) { sorted[i] = array.getJsonObject(i); } if (sorted[0].getJsonNumber(key).longValue() > sorted[1].getJsonNumber(key).longValue()) { JsonObject o = sorted[1]; sorted[1] = sorted[0]; sorted[0] = o; } if (usingCore()) { if (sorted[1].getJsonNumber(key).longValue() > sorted[2].getJsonNumber(key).longValue()) { JsonObject o = sorted[2]; sorted[2] = sorted[1]; sorted[1] = o; } if (sorted[0].getJsonNumber(key).longValue() > sorted[1].getJsonNumber(key).longValue()) { JsonObject o = sorted[1]; sorted[1] = sorted[0]; sorted[0] = o; } } JsonObject first = sorted[0]; JsonObject second = sorted[1]; Assert.assertTrue(first.getString("connectionID").length() > 0); Assert.assertTrue(first.getString("clientAddress").length() > 0); Assert.assertTrue(first.getJsonNumber("creationTime").longValue() > 0); Assert.assertEquals(0, first.getJsonNumber("sessionCount").longValue()); Assert.assertTrue(second.getString("connectionID").length() > 0); Assert.assertTrue(second.getString("clientAddress").length() > 0); Assert.assertTrue(second.getJsonNumber("creationTime").longValue() > 0); Assert.assertEquals(1, second.getJsonNumber("sessionCount").longValue()); } @Test public void testListConsumersAsJSON() throws Exception { SimpleString queueName = new SimpleString(UUID.randomUUID().toString()); final String filter = "x = 1"; ActiveMQServerControl serverControl = createManagementControl(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory factory = createSessionFactory(locator); ClientSession session = addClientSession(factory.createSession()); server.addAddressInfo(new AddressInfo(queueName, RoutingType.ANYCAST)); server.createQueue(queueName, RoutingType.ANYCAST, queueName, null, false, false); addClientConsumer(session.createConsumer(queueName)); Thread.sleep(100); // We check the timestamp for the creation time. We need to make sure it's different addClientConsumer(session.createConsumer(queueName, SimpleString.toSimpleString(filter), true)); String jsonString = serverControl.listConsumersAsJSON(factory.getConnection().getID().toString()); IntegrationTestLogger.LOGGER.info(jsonString); Assert.assertNotNull(jsonString); JsonArray array = JsonUtil.readJsonArray(jsonString); Assert.assertEquals(2, array.size()); JsonObject first; JsonObject second; if (array.getJsonObject(0).getJsonNumber("creationTime").longValue() < array.getJsonObject(1).getJsonNumber("creationTime").longValue()) { first = array.getJsonObject(0); second = array.getJsonObject(1); } else { first = array.getJsonObject(1); second = array.getJsonObject(0); } Assert.assertNotNull(first.getJsonNumber("consumerID").longValue()); Assert.assertTrue(first.getString("connectionID").length() > 0); Assert.assertEquals(factory.getConnection().getID().toString(), first.getString("connectionID")); Assert.assertTrue(first.getString("sessionID").length() > 0); Assert.assertEquals(((ClientSessionImpl) session).getName(), first.getString("sessionID")); Assert.assertTrue(first.getString("queueName").length() > 0); Assert.assertEquals(queueName.toString(), first.getString("queueName")); Assert.assertEquals(false, first.getBoolean("browseOnly")); Assert.assertTrue(first.getJsonNumber("creationTime").longValue() > 0); Assert.assertEquals(0, first.getJsonNumber("deliveringCount").longValue()); Assert.assertNotNull(second.getJsonNumber("consumerID").longValue()); Assert.assertTrue(second.getString("connectionID").length() > 0); Assert.assertEquals(factory.getConnection().getID().toString(), second.getString("connectionID")); Assert.assertTrue(second.getString("sessionID").length() > 0); Assert.assertEquals(((ClientSessionImpl) session).getName(), second.getString("sessionID")); Assert.assertTrue(second.getString("queueName").length() > 0); Assert.assertEquals(queueName.toString(), second.getString("queueName")); Assert.assertEquals(true, second.getBoolean("browseOnly")); Assert.assertTrue(second.getJsonNumber("creationTime").longValue() > 0); Assert.assertEquals(0, second.getJsonNumber("deliveringCount").longValue()); Assert.assertTrue(second.getString("filter").length() > 0); Assert.assertEquals(filter, second.getString("filter")); } @Test public void testListAllConsumersAsJSON() throws Exception { SimpleString queueName = new SimpleString(UUID.randomUUID().toString()); ActiveMQServerControl serverControl = createManagementControl(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory factory = createSessionFactory(locator); ClientSession session = addClientSession(factory.createSession()); ServerLocator locator2 = createInVMNonHALocator(); ClientSessionFactory factory2 = createSessionFactory(locator2); ClientSession session2 = addClientSession(factory2.createSession()); serverControl.createAddress(queueName.toString(), "ANYCAST"); server.createQueue(queueName, RoutingType.ANYCAST, queueName, null, false, false); addClientConsumer(session.createConsumer(queueName)); Thread.sleep(200); addClientConsumer(session2.createConsumer(queueName)); String jsonString = serverControl.listAllConsumersAsJSON(); IntegrationTestLogger.LOGGER.info(jsonString); Assert.assertNotNull(jsonString); JsonArray array = JsonUtil.readJsonArray(jsonString); Assert.assertEquals(usingCore() ? 3 : 2, array.size()); String key = "creationTime"; JsonObject[] sorted = new JsonObject[array.size()]; for (int i = 0; i < array.size(); i++) { sorted[i] = array.getJsonObject(i); } if (sorted[0].getJsonNumber(key).longValue() > sorted[1].getJsonNumber(key).longValue()) { JsonObject o = sorted[1]; sorted[1] = sorted[0]; sorted[0] = o; } if (usingCore()) { if (sorted[1].getJsonNumber(key).longValue() > sorted[2].getJsonNumber(key).longValue()) { JsonObject o = sorted[2]; sorted[2] = sorted[1]; sorted[1] = o; } if (sorted[0].getJsonNumber(key).longValue() > sorted[1].getJsonNumber(key).longValue()) { JsonObject o = sorted[1]; sorted[1] = sorted[0]; sorted[0] = o; } } JsonObject first = sorted[0]; JsonObject second = sorted[1]; Assert.assertTrue(first.getJsonNumber("creationTime").longValue() > 0); Assert.assertNotNull(first.getJsonNumber("consumerID").longValue()); Assert.assertTrue(first.getString("connectionID").length() > 0); Assert.assertEquals(factory.getConnection().getID().toString(), first.getString("connectionID")); Assert.assertTrue(first.getString("sessionID").length() > 0); Assert.assertEquals(((ClientSessionImpl) session).getName(), first.getString("sessionID")); Assert.assertTrue(first.getString("queueName").length() > 0); Assert.assertEquals(queueName.toString(), first.getString("queueName")); Assert.assertEquals(false, first.getBoolean("browseOnly")); Assert.assertEquals(0, first.getJsonNumber("deliveringCount").longValue()); Assert.assertTrue(second.getJsonNumber("creationTime").longValue() > 0); Assert.assertNotNull(second.getJsonNumber("consumerID").longValue()); Assert.assertTrue(second.getString("connectionID").length() > 0); Assert.assertEquals(factory2.getConnection().getID().toString(), second.getString("connectionID")); Assert.assertTrue(second.getString("sessionID").length() > 0); Assert.assertEquals(((ClientSessionImpl) session2).getName(), second.getString("sessionID")); Assert.assertTrue(second.getString("queueName").length() > 0); Assert.assertEquals(queueName.toString(), second.getString("queueName")); Assert.assertEquals(false, second.getBoolean("browseOnly")); Assert.assertEquals(0, second.getJsonNumber("deliveringCount").longValue()); } @Test public void testListSessionsAsJSON() throws Exception { SimpleString queueName = new SimpleString(UUID.randomUUID().toString()); server.addAddressInfo(new AddressInfo(queueName, RoutingType.ANYCAST)); server.createQueue(queueName, RoutingType.ANYCAST, queueName, null, false, false); ActiveMQServerControl serverControl = createManagementControl(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory factory = createSessionFactory(locator); ClientSession session1 = addClientSession(factory.createSession()); Thread.sleep(5); ClientSession session2 = addClientSession(factory.createSession("myUser", "myPass", false, false, false, false, 0)); session2.createConsumer(queueName); String jsonString = serverControl.listSessionsAsJSON(factory.getConnection().getID().toString()); IntegrationTestLogger.LOGGER.info(jsonString); Assert.assertNotNull(jsonString); JsonArray array = JsonUtil.readJsonArray(jsonString); Assert.assertEquals(2, array.size()); JsonObject first; JsonObject second; if (array.getJsonObject(0).getJsonNumber("creationTime").longValue() < array.getJsonObject(1).getJsonNumber("creationTime").longValue()) { first = array.getJsonObject(0); second = array.getJsonObject(1); } else { first = array.getJsonObject(1); second = array.getJsonObject(0); } Assert.assertTrue(first.getString("sessionID").length() > 0); Assert.assertEquals(((ClientSessionImpl) session1).getName(), first.getString("sessionID")); Assert.assertTrue(first.getString("principal").length() > 0); Assert.assertEquals("guest", first.getString("principal")); Assert.assertTrue(first.getJsonNumber("creationTime").longValue() > 0); Assert.assertEquals(0, first.getJsonNumber("consumerCount").longValue()); Assert.assertTrue(second.getString("sessionID").length() > 0); Assert.assertEquals(((ClientSessionImpl) session2).getName(), second.getString("sessionID")); Assert.assertTrue(second.getString("principal").length() > 0); Assert.assertEquals("myUser", second.getString("principal")); Assert.assertTrue(second.getJsonNumber("creationTime").longValue() > 0); Assert.assertEquals(1, second.getJsonNumber("consumerCount").longValue()); } @Test public void testConnectorServiceManagement() throws Exception { ActiveMQServerControl managementControl = createManagementControl(); managementControl.createConnectorService("myconn", FakeConnectorServiceFactory.class.getCanonicalName(), new HashMap<String, Object>()); Assert.assertEquals(1, server.getConnectorsService().getConnectors().size()); managementControl.createConnectorService("myconn2", FakeConnectorServiceFactory.class.getCanonicalName(), new HashMap<String, Object>()); Assert.assertEquals(2, server.getConnectorsService().getConnectors().size()); managementControl.destroyConnectorService("myconn"); Assert.assertEquals(1, server.getConnectorsService().getConnectors().size()); Assert.assertEquals("myconn2", managementControl.getConnectorServices()[0]); } protected void scaleDown(ScaleDownHandler handler) throws Exception { SimpleString address = new SimpleString("testQueue"); HashMap<String, Object> params = new HashMap<>(); params.put(TransportConstants.SERVER_ID_PROP_NAME, "2"); Configuration config = createDefaultInVMConfig(2).clearAcceptorConfigurations().addAcceptorConfiguration(new TransportConfiguration(InVMAcceptorFactory.class.getName(), params)).setSecurityEnabled(false); ActiveMQServer server2 = addServer(ActiveMQServers.newActiveMQServer(config, null, true)); this.conf.clearConnectorConfigurations().addConnectorConfiguration("server2-connector", new TransportConfiguration(INVM_CONNECTOR_FACTORY, params)); server2.start(); server.addAddressInfo(new AddressInfo(address, RoutingType.ANYCAST)); server.createQueue(address, RoutingType.ANYCAST, address, null, true, false, -1, false, false); server2.addAddressInfo(new AddressInfo(address, RoutingType.ANYCAST)); server2.createQueue(address, RoutingType.ANYCAST, address, null, true, false, -1, false, false); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory csf = createSessionFactory(locator); ClientSession session = csf.createSession(); ClientProducer producer = session.createProducer(address); for (int i = 0; i < 100; i++) { ClientMessage message = session.createMessage(true); message.getBodyBuffer().writeString("m" + i); producer.send(message); } ActiveMQServerControl managementControl = createManagementControl(); handler.scaleDown(managementControl); locator.close(); locator = addServerLocator(ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(INVM_CONNECTOR_FACTORY, params))); csf = createSessionFactory(locator); session = csf.createSession(); session.start(); ClientConsumer consumer = session.createConsumer(address); for (int i = 0; i < 100; i++) { ClientMessage m = consumer.receive(5000); assertNotNull(m); } } // Package protected --------------------------------------------- interface ScaleDownHandler { void scaleDown(ActiveMQServerControl control) throws Exception; } // Protected ----------------------------------------------------- @Override @Before public void setUp() throws Exception { super.setUp(); connectorConfig = new TransportConfiguration(INVM_CONNECTOR_FACTORY); conf = createDefaultNettyConfig().setJMXManagementEnabled(true).addConnectorConfiguration(connectorConfig.getName(), connectorConfig); conf.setSecurityEnabled(true); SecurityConfiguration securityConfiguration = new SecurityConfiguration(); securityConfiguration.addUser("guest", "guest"); securityConfiguration.addUser("myUser", "myPass"); securityConfiguration.addRole("guest", "guest"); securityConfiguration.addRole("myUser", "guest"); securityConfiguration.setDefaultUser("guest"); ActiveMQJAASSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(), securityConfiguration); server = addServer(ActiveMQServers.newActiveMQServer(conf, mbeanServer, securityManager, true)); server.start(); HashSet<Role> role = new HashSet<>(); role.add(new Role("guest", true, true, true, true, true, true, true, true, true, true)); server.getSecurityRepository().addMatch("#", role); } protected ActiveMQServerControl createManagementControl() throws Exception { return ManagementControlHelper.createActiveMQServerControl(mbeanServer); } // Private ------------------------------------------------------- // Inner classes ------------------------------------------------- }