/* * 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.server; import java.util.ArrayList; import java.util.List; import org.apache.activemq.artemis.api.core.ActiveMQException; import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException; import org.apache.activemq.artemis.api.core.SimpleString; 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.core.config.Configuration; import org.apache.activemq.artemis.core.config.CoreQueueConfiguration; import org.apache.activemq.artemis.core.postoffice.Bindings; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.ActiveMQServers; import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger; import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class PredefinedQueueTest extends ActiveMQTestBase { private static final IntegrationTestLogger log = IntegrationTestLogger.LOGGER; private Configuration configuration = null; @Override @Before public void setUp() throws Exception { super.setUp(); configuration = createDefaultInVMConfig(); } @Test public void testFailOnCreatePredefinedQueues() throws Exception { final String testAddress = "testAddress"; final String queueName1 = "queue1"; final String queueName2 = "queue2"; final String queueName3 = "queue3"; CoreQueueConfiguration queue1 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName1); CoreQueueConfiguration queue2 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName2); CoreQueueConfiguration queue3 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName3); List<CoreQueueConfiguration> queueConfs = new ArrayList<>(); queueConfs.add(queue1); queueConfs.add(queue2); queueConfs.add(queue3); configuration.setQueueConfigurations(queueConfs); ActiveMQServer server = addServer(ActiveMQServers.newActiveMQServer(configuration, false)); server.start(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = addClientSession(sf.createSession(false, true, true)); try { session.createQueue(testAddress, queueName1, "", false); Assert.fail("Should throw exception"); } catch (ActiveMQQueueExistsException se) { //ok } catch (ActiveMQException e) { fail("Invalid Exception type:" + e.getType()); } try { session.createQueue(testAddress, queueName2, null, false); Assert.fail("Should throw exception"); } catch (ActiveMQQueueExistsException se) { //ok } catch (ActiveMQException e) { fail("Invalid Exception type:" + e.getType()); } try { session.createQueue(testAddress, queueName3, null, false); Assert.fail("Should throw exception"); } catch (ActiveMQQueueExistsException se) { //ok } catch (ActiveMQException e) { fail("Invalid Exception type:" + e.getType()); } } @Test public void testDeploySameNames() throws Exception { final String testAddress = "testAddress"; final String queueName1 = "queue1"; final String queueName2 = "queue2"; CoreQueueConfiguration queue1 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName1); CoreQueueConfiguration queue2 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName2); configuration.addQueueConfiguration(queue1).addQueueConfiguration(queue2); ActiveMQServer server = addServer(ActiveMQServers.newActiveMQServer(configuration, false)); server.start(); Bindings bindings = server.getPostOffice().getBindingsForAddress(new SimpleString(testAddress)); Assert.assertEquals(2, bindings.getBindings().size()); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = addClientSession(sf.createSession(false, true, true)); session.start(); ClientProducer producer = addClientProducer(session.createProducer(new SimpleString(testAddress))); ClientConsumer consumer1 = addClientConsumer(session.createConsumer(queueName1)); ClientConsumer consumer2 = addClientConsumer(session.createConsumer(queueName2)); final int numMessages = 10; final SimpleString propKey = new SimpleString("testkey"); for (int i = 0; i < numMessages; i++) { ClientMessage message = session.createMessage(false); message.putIntProperty(propKey, i); producer.send(message); } for (int i = 0; i < numMessages; i++) { ClientMessage message = consumer1.receive(200); Assert.assertNotNull(message); Assert.assertEquals(i, message.getObjectProperty(propKey)); message.acknowledge(); message = consumer2.receive(200); Assert.assertNotNull(message); Assert.assertEquals(i, message.getObjectProperty(propKey)); message.acknowledge(); } Assert.assertNull(consumer1.receiveImmediate()); Assert.assertNull(consumer2.receiveImmediate()); } @Test public void testDeployPreexistingQueues() throws Exception { final String testAddress = "testAddress"; final String queueName1 = "queue1"; final String queueName2 = "queue2"; final String queueName3 = "queue3"; ActiveMQServer server = addServer(ActiveMQServers.newActiveMQServer(configuration)); server.start(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = addClientSession(sf.createSession(false, true, true)); session.createQueue(testAddress, queueName1, null, true); session.createQueue(testAddress, queueName2, null, true); session.createQueue(testAddress, queueName3, null, true); session.close(); sf.close(); server.stop(); CoreQueueConfiguration queue1 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName1); CoreQueueConfiguration queue2 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName2); CoreQueueConfiguration queue3 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName3); configuration.addQueueConfiguration(queue1).addQueueConfiguration(queue2).addQueueConfiguration(queue3); server.start(); sf = createSessionFactory(locator); session = addClientSession(sf.createSession(false, true, true)); session.start(); ClientProducer producer = session.createProducer(new SimpleString(testAddress)); ClientConsumer consumer1 = session.createConsumer(queueName1); ClientConsumer consumer2 = session.createConsumer(queueName2); ClientConsumer consumer3 = session.createConsumer(queueName3); final int numMessages = 10; final SimpleString propKey = new SimpleString("testkey"); for (int i = 0; i < numMessages; i++) { ClientMessage message = session.createMessage(false); message.putIntProperty(propKey, i); producer.send(message); } for (int i = 0; i < numMessages; i++) { ClientMessage message = consumer1.receive(200); Assert.assertNotNull(message); Assert.assertEquals(i, message.getObjectProperty(propKey)); message.acknowledge(); message = consumer2.receive(200); Assert.assertNotNull(message); Assert.assertEquals(i, message.getObjectProperty(propKey)); message.acknowledge(); message = consumer3.receive(200); Assert.assertNotNull(message); Assert.assertEquals(i, message.getObjectProperty(propKey)); message.acknowledge(); } Assert.assertNull(consumer1.receiveImmediate()); Assert.assertNull(consumer2.receiveImmediate()); Assert.assertNull(consumer3.receiveImmediate()); } @Test public void testDurableNonDurable() throws Exception { final String testAddress = "testAddress"; final String queueName1 = "queue1"; final String queueName2 = "queue2"; CoreQueueConfiguration queue1 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName1).setDurable(false); CoreQueueConfiguration queue2 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName2); List<CoreQueueConfiguration> queueConfs = new ArrayList<>(); queueConfs.add(queue1); queueConfs.add(queue2); configuration.addQueueConfiguration(queue1).addQueueConfiguration(queue2); ActiveMQServer server = addServer(ActiveMQServers.newActiveMQServer(configuration)); server.start(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = addClientSession(sf.createSession(false, true, true)); ClientProducer producer = session.createProducer(new SimpleString(testAddress)); final SimpleString propKey = new SimpleString("testkey"); final int numMessages = 1; PredefinedQueueTest.log.info("sending messages"); for (int i = 0; i < numMessages; i++) { ClientMessage message = session.createMessage(true); message.putIntProperty(propKey, i); producer.send(message); } session.close(); PredefinedQueueTest.log.info("stopping"); sf.close(); server.stop(); server.start(); sf = createSessionFactory(locator); session = addClientSession(sf.createSession(false, true, true)); session.start(); ClientConsumer consumer1 = session.createConsumer(queueName1); ClientConsumer consumer2 = session.createConsumer(queueName2); ClientMessage message = consumer1.receiveImmediate(); Assert.assertNull(message); for (int i = 0; i < numMessages; i++) { message = consumer2.receive(200); Assert.assertNotNull(message); Assert.assertEquals(i, message.getObjectProperty(propKey)); message.acknowledge(); } Assert.assertNull(consumer1.receiveImmediate()); Assert.assertNull(consumer2.receiveImmediate()); } @Test public void testDeployWithFilter() throws Exception { final String testAddress = "testAddress"; final String queueName1 = "queue1"; final String filter = "cheese='camembert'"; CoreQueueConfiguration queue1 = new CoreQueueConfiguration().setAddress(testAddress).setName(queueName1).setFilterString(filter).setDurable(false); configuration.addQueueConfiguration(queue1); ActiveMQServer server = addServer(ActiveMQServers.newActiveMQServer(configuration, false)); server.start(); ServerLocator locator = createInVMNonHALocator(); ClientSessionFactory sf = createSessionFactory(locator); ClientSession session = addClientSession(sf.createSession(false, true, true)); ClientProducer producer = session.createProducer(new SimpleString(testAddress)); final SimpleString propKey = new SimpleString("testkey"); final int numMessages = 1; PredefinedQueueTest.log.info("sending messages"); for (int i = 0; i < numMessages; i++) { ClientMessage message = session.createMessage(true); message.putStringProperty(new SimpleString("cheese"), new SimpleString("camembert")); message.putIntProperty(propKey, i); producer.send(message); } session.start(); ClientConsumer consumer1 = session.createConsumer(queueName1); for (int i = 0; i < numMessages; i++) { ClientMessage message = consumer1.receive(200); Assert.assertNotNull(message); Assert.assertEquals(i, message.getObjectProperty(propKey)); message.acknowledge(); } Assert.assertNull(consumer1.receiveImmediate()); for (int i = 0; i < numMessages; i++) { ClientMessage message = session.createMessage(true); message.putStringProperty(new SimpleString("cheese"), new SimpleString("roquefort")); message.putIntProperty(propKey, i); producer.send(message); } Assert.assertNull(consumer1.receiveImmediate()); } }