/*
* 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.Message;
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.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServers;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class ExpiryAddressTest extends ActiveMQTestBase {
private static final IntegrationTestLogger log = IntegrationTestLogger.LOGGER;
private ActiveMQServer server;
private ClientSession clientSession;
private ServerLocator locator;
@Test
public void testBasicSend() throws Exception {
SimpleString ea = new SimpleString("EA");
SimpleString adSend = new SimpleString("a1");
SimpleString qName = new SimpleString("q1");
SimpleString eq = new SimpleString("EA1");
AddressSettings addressSettings = new AddressSettings().setExpiryAddress(ea);
server.getAddressSettingsRepository().addMatch("#", addressSettings);
clientSession.createQueue(ea, eq, null, false);
clientSession.createQueue(adSend, qName, null, false);
ClientProducer producer = clientSession.createProducer(adSend);
ClientMessage clientMessage = createTextMessage(clientSession, "heyho!");
clientMessage.setExpiration(System.currentTimeMillis());
producer.send(clientMessage);
clientSession.start();
ClientConsumer clientConsumer = clientSession.createConsumer(qName);
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
clientConsumer = clientSession.createConsumer(eq);
m = clientConsumer.receive(500);
Assert.assertNotNull(m);
Assert.assertEquals(qName.toString(), m.getStringProperty(Message.HDR_ORIGINAL_QUEUE));
Assert.assertEquals(adSend.toString(), m.getStringProperty(Message.HDR_ORIGINAL_ADDRESS));
Assert.assertNotNull(m);
Assert.assertEquals(m.getBodyBuffer().readString(), "heyho!");
m.acknowledge();
}
@Test
public void testBasicSendWithRetroActiveAddressSettings() throws Exception {
// apply "original" address settings
SimpleString expiryAddress1 = new SimpleString("expiryAddress1");
SimpleString qName = new SimpleString("q1");
SimpleString expiryQueue1 = new SimpleString("expiryQueue1");
AddressSettings addressSettings = new AddressSettings().setExpiryAddress(expiryAddress1);
server.getAddressSettingsRepository().addMatch(qName.toString(), addressSettings);
clientSession.createQueue(expiryAddress1, expiryQueue1, null, false);
clientSession.createQueue(qName, qName, null, false);
// override "original" address settings
SimpleString expiryAddress2 = new SimpleString("expiryAddress2");
SimpleString expiryQueue2 = new SimpleString("expiryQueue2");
addressSettings = new AddressSettings().setExpiryAddress(expiryAddress2);
server.getAddressSettingsRepository().addMatch(qName.toString(), addressSettings);
clientSession.createQueue(expiryAddress2, expiryQueue2, null, false);
// send message that will expire ASAP
ClientProducer producer = clientSession.createProducer(qName);
ClientMessage clientMessage = createTextMessage(clientSession, "heyho!");
clientMessage.setExpiration(System.currentTimeMillis());
producer.send(clientMessage);
clientSession.start();
// make sure the message has expired from the original queue
ClientConsumer clientConsumer = clientSession.createConsumer(qName);
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
// make sure the message wasn't sent to the original expiry address
clientConsumer = clientSession.createConsumer(expiryQueue1);
m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
// make sure the message was sent to the expected expected expiry address
clientConsumer = clientSession.createConsumer(expiryQueue2);
m = clientConsumer.receive(500);
Assert.assertNotNull(m);
Assert.assertEquals(m.getBodyBuffer().readString(), "heyho!");
m.acknowledge();
}
@Test
public void testBasicSendToMultipleQueues() throws Exception {
SimpleString ea = new SimpleString("EA");
SimpleString qName = new SimpleString("q1");
SimpleString eq = new SimpleString("EQ1");
SimpleString eq2 = new SimpleString("EQ2");
AddressSettings addressSettings = new AddressSettings().setExpiryAddress(ea);
server.getAddressSettingsRepository().addMatch(qName.toString(), addressSettings);
clientSession.createQueue(ea, eq, null, false);
clientSession.createQueue(ea, eq2, null, false);
clientSession.createQueue(qName, qName, null, false);
ClientProducer producer = clientSession.createProducer(qName);
ClientMessage clientMessage = createTextMessage(clientSession, "heyho!");
clientMessage.setExpiration(System.currentTimeMillis());
producer.send(clientMessage);
clientSession.start();
ClientConsumer clientConsumer = clientSession.createConsumer(qName);
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
clientConsumer = clientSession.createConsumer(eq);
m = clientConsumer.receive(500);
Assert.assertNotNull(m);
assertNotNull(m.getStringProperty(Message.HDR_ORIGINAL_ADDRESS));
assertNotNull(m.getStringProperty(Message.HDR_ORIGINAL_QUEUE));
ExpiryAddressTest.log.info("acking");
m.acknowledge();
Assert.assertEquals(m.getBodyBuffer().readString(), "heyho!");
clientConsumer.close();
clientConsumer = clientSession.createConsumer(eq2);
m = clientConsumer.receive(500);
Assert.assertNotNull(m);
assertNotNull(m.getStringProperty(Message.HDR_ORIGINAL_ADDRESS));
assertNotNull(m.getStringProperty(Message.HDR_ORIGINAL_QUEUE));
ExpiryAddressTest.log.info("acking");
m.acknowledge();
Assert.assertEquals(m.getBodyBuffer().readString(), "heyho!");
clientConsumer.close();
clientSession.commit();
}
@Test
public void testBasicSendToNoQueue() throws Exception {
SimpleString ea = new SimpleString("EA");
SimpleString qName = new SimpleString("q1");
SimpleString eq = new SimpleString("EQ1");
SimpleString eq2 = new SimpleString("EQ2");
clientSession.createQueue(ea, eq, null, false);
clientSession.createQueue(ea, eq2, null, false);
clientSession.createQueue(qName, qName, null, false);
ClientProducer producer = clientSession.createProducer(qName);
ClientMessage clientMessage = createTextMessage(clientSession, "heyho!");
clientMessage.setExpiration(System.currentTimeMillis());
producer.send(clientMessage);
clientSession.start();
ClientConsumer clientConsumer = clientSession.createConsumer(qName);
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
}
@Test
public void testHeadersSet() throws Exception {
final int NUM_MESSAGES = 5;
SimpleString ea = new SimpleString("DLA");
SimpleString qName = new SimpleString("q1");
AddressSettings addressSettings = new AddressSettings().setExpiryAddress(ea);
server.getAddressSettingsRepository().addMatch(qName.toString(), addressSettings);
SimpleString eq = new SimpleString("EA1");
clientSession.createQueue(ea, eq, null, false);
clientSession.createQueue(qName, qName, null, false);
ServerLocator locator1 = createInVMNonHALocator();
ClientSessionFactory sessionFactory = createSessionFactory(locator1);
ClientSession sendSession = sessionFactory.createSession(false, true, true);
ClientProducer producer = sendSession.createProducer(qName);
long expiration = System.currentTimeMillis();
for (int i = 0; i < NUM_MESSAGES; i++) {
ClientMessage tm = createTextMessage(clientSession, "Message:" + i);
tm.setExpiration(expiration);
producer.send(tm);
}
ClientConsumer clientConsumer = clientSession.createConsumer(qName);
clientSession.start();
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
// All the messages should now be in the EQ
ClientConsumer cc3 = clientSession.createConsumer(eq);
for (int i = 0; i < NUM_MESSAGES; i++) {
ClientMessage tm = cc3.receive(1000);
Assert.assertNotNull(tm);
String text = tm.getBodyBuffer().readString();
Assert.assertEquals("Message:" + i, text);
// Check the headers
Long actualExpiryTime = (Long) tm.getObjectProperty(Message.HDR_ACTUAL_EXPIRY_TIME);
Assert.assertTrue(actualExpiryTime >= expiration);
}
sendSession.close();
locator1.close();
}
@Test
public void testExpireWithDefaultAddressSettings() throws Exception {
SimpleString ea = new SimpleString("EA");
SimpleString qName = new SimpleString("q1");
SimpleString eq = new SimpleString("EA1");
AddressSettings addressSettings = new AddressSettings().setExpiryAddress(ea);
server.getAddressSettingsRepository().setDefault(addressSettings);
clientSession.createQueue(ea, eq, null, false);
clientSession.createQueue(qName, qName, null, false);
ClientProducer producer = clientSession.createProducer(qName);
ClientMessage clientMessage = createTextMessage(clientSession, "heyho!");
clientMessage.setExpiration(System.currentTimeMillis());
producer.send(clientMessage);
clientSession.start();
ClientConsumer clientConsumer = clientSession.createConsumer(qName);
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
clientConsumer = clientSession.createConsumer(eq);
m = clientConsumer.receive(500);
Assert.assertNotNull(m);
Assert.assertEquals(m.getBodyBuffer().readString(), "heyho!");
m.acknowledge();
}
@Test
public void testExpireWithWildcardAddressSettings() throws Exception {
SimpleString ea = new SimpleString("EA");
SimpleString qName = new SimpleString("q1");
SimpleString eq = new SimpleString("EA1");
AddressSettings addressSettings = new AddressSettings().setExpiryAddress(ea);
server.getAddressSettingsRepository().addMatch("*", addressSettings);
clientSession.createQueue(ea, eq, null, false);
clientSession.createQueue(qName, qName, null, false);
ClientProducer producer = clientSession.createProducer(qName);
ClientMessage clientMessage = createTextMessage(clientSession, "heyho!");
clientMessage.setExpiration(System.currentTimeMillis());
producer.send(clientMessage);
clientSession.start();
ClientConsumer clientConsumer = clientSession.createConsumer(qName);
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
clientConsumer = clientSession.createConsumer(eq);
m = clientConsumer.receive(500);
Assert.assertNotNull(m);
Assert.assertEquals(m.getBodyBuffer().readString(), "heyho!");
m.acknowledge();
}
@Test
public void testExpireWithOverridenSublevelAddressSettings() throws Exception {
SimpleString address = new SimpleString("prefix.address");
SimpleString queue = RandomUtil.randomSimpleString();
SimpleString defaultExpiryAddress = RandomUtil.randomSimpleString();
SimpleString defaultExpiryQueue = RandomUtil.randomSimpleString();
SimpleString specificExpiryAddress = RandomUtil.randomSimpleString();
SimpleString specificExpiryQueue = RandomUtil.randomSimpleString();
AddressSettings defaultAddressSettings = new AddressSettings().setExpiryAddress(defaultExpiryAddress);
server.getAddressSettingsRepository().addMatch("prefix.*", defaultAddressSettings);
AddressSettings specificAddressSettings = new AddressSettings().setExpiryAddress(specificExpiryAddress);
server.getAddressSettingsRepository().addMatch("prefix.address", specificAddressSettings);
clientSession.createQueue(address, queue, false);
clientSession.createQueue(defaultExpiryAddress, defaultExpiryQueue, false);
clientSession.createQueue(specificExpiryAddress, specificExpiryQueue, false);
ClientProducer producer = clientSession.createProducer(address);
ClientMessage clientMessage = createTextMessage(clientSession, "heyho!");
clientMessage.setExpiration(System.currentTimeMillis());
producer.send(clientMessage);
clientSession.start();
ClientConsumer clientConsumer = clientSession.createConsumer(queue);
ClientMessage m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
clientConsumer = clientSession.createConsumer(defaultExpiryQueue);
m = clientConsumer.receiveImmediate();
Assert.assertNull(m);
clientConsumer.close();
clientConsumer = clientSession.createConsumer(specificExpiryQueue);
m = clientConsumer.receive(500);
Assert.assertNotNull(m);
Assert.assertEquals(m.getBodyBuffer().readString(), "heyho!");
m.acknowledge();
}
@Override
@Before
public void setUp() throws Exception {
super.setUp();
server = addServer(ActiveMQServers.newActiveMQServer(createDefaultInVMConfig(), false));
server.start();
// then we create a client as normal
locator = createInVMNonHALocator().setBlockOnAcknowledge(true);
ClientSessionFactory sessionFactory = createSessionFactory(locator);
// There are assertions over sizes that needs to be done after the ACK
// was received on server
clientSession = addClientSession(sessionFactory.createSession(null, null, false, true, true, false, 0));
}
}