/*
* 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.client;
import org.apache.activemq.artemis.api.core.ActiveMQInvalidTransientQueueUseException;
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.tests.util.SingleServerTestBase;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.junit.Test;
public class TransientQueueTest extends SingleServerTestBase {
@Test
public void testSimpleTransientQueue() throws Exception {
SimpleString queue = RandomUtil.randomSimpleString();
SimpleString address = RandomUtil.randomSimpleString();
session.createSharedQueue(address, queue, false);
assertEquals(1, server.getConnectionCount());
// we create a second session. the temp queue must be present
// even after we closed the session which created it
ClientSession session2 = sf.createSession(false, true, true);
session.close();
session2.start();
session2.createConsumer(queue);
session2.close();
}
@Test
public void testMultipleConsumers() throws Exception {
SimpleString queue = SimpleString.toSimpleString("queue");
SimpleString address = SimpleString.toSimpleString("address");
session.createSharedQueue(address, queue, false);
assertEquals(1, server.getConnectionCount());
assertNotNull(server.locateQueue(queue));
ServerLocator locator2 = createLocator();
ClientSessionFactory sf2 = locator2.createSessionFactory();
ClientSession session2 = sf2.createSession(false, false);
// At this point this has no effect, other than making sure the queue exists...
// the JMS implementation will certainly create the queue again when dealing with
// non durable shared subscriptions
session2.createSharedQueue(address, queue, false);
ClientConsumer consumer1 = session.createConsumer(queue);
ClientConsumer consumer2 = session2.createConsumer(queue);
session.start();
session2.start();
ClientProducer producer = session.createProducer(address);
for (int i = 0; i < 1000; i++) {
ClientMessage msg = session.createMessage(false);
producer.send(msg);
}
ClientMessage msg;
for (int i = 0; i < 500; i++) {
msg = consumer1.receive(1000);
assertNotNull(msg);
msg.acknowledge();
msg = consumer2.receive(1000);
assertNotNull(msg);
msg.acknowledge();
}
assertNull(consumer1.receiveImmediate());
assertNull(consumer2.receiveImmediate());
for (int i = 0; i < 1000; i++) {
msg = session.createMessage(false);
producer.send(msg);
}
msg = consumer1.receiveImmediate();
assertNotNull(msg);
msg.acknowledge();
msg = consumer2.receiveImmediate();
assertNotNull(msg);
msg.acknowledge();
consumer1.close();
consumer2.close();
session.createSharedQueue(address, queue, false);
consumer1 = session.createConsumer(queue);
// validate if the queue was deleted after the consumer was closed
assertNotNull(server.locateQueue(queue));
assertNull(consumer1.receiveImmediate());
consumer1.close();
assertNull(server.locateQueue(queue));
}
@Test
public void testQueueDifferentConfigs() throws Exception {
SimpleString queue = RandomUtil.randomSimpleString();
SimpleString address = RandomUtil.randomSimpleString();
server.locateQueue(queue);
SimpleString address2 = RandomUtil.randomSimpleString();
session.createSharedQueue(address, queue, false);
assertEquals(1, server.getConnectionCount());
ServerLocator locator2 = createLocator();
ClientSessionFactory sf2 = locator2.createSessionFactory();
ClientSession session2 = sf2.createSession(false, false);
addClientSession(session2);
boolean exHappened = false;
try {
// There's already a queue with that name, we are supposed to throw an exception
session2.createSharedQueue(address2, queue, false);
} catch (ActiveMQInvalidTransientQueueUseException e) {
exHappened = true;
}
assertTrue(exHappened);
exHappened = false;
try {
// There's already a queue with that name, we are supposed to throw an exception
session2.createSharedQueue(address, queue, SimpleString.toSimpleString("a=1"), false);
} catch (ActiveMQInvalidTransientQueueUseException e) {
exHappened = true;
}
assertTrue(exHappened);
// forcing a consumer close to make the queue go away
session.createConsumer(queue).close();
assertNull(server.locateQueue(queue));
session.createSharedQueue(address, queue, SimpleString.toSimpleString("q=1"), false);
exHappened = false;
try {
// There's already a queue with that name, we are supposed to throw an exception
session2.createSharedQueue(address, queue, SimpleString.toSimpleString("q=2"), false);
} catch (ActiveMQInvalidTransientQueueUseException e) {
exHappened = true;
}
assertTrue(exHappened);
exHappened = false;
try {
// There's already a queue with that name, we are supposed to throw an exception
session2.createSharedQueue(address, queue, false);
} catch (ActiveMQInvalidTransientQueueUseException e) {
exHappened = true;
}
assertTrue(exHappened);
}
@Override
protected ServerLocator createLocator() {
return super.createLocator().setConsumerWindowSize(0).setBlockOnAcknowledge(true).setBlockOnDurableSend(false).setBlockOnNonDurableSend(false);
}
}