// Copyright (c) 2007-Present Pivotal Software, Inc. All rights reserved.
//
// This software, the RabbitMQ Java client library, is triple-licensed under the
// Mozilla Public License 1.1 ("MPL"), the GNU General Public License version 2
// ("GPL") and the Apache License version 2 ("ASL"). For the MPL, please see
// LICENSE-MPL-RabbitMQ. For the GPL, please see LICENSE-GPL2. For the ASL,
// please see LICENSE-APACHE2.
//
// This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND,
// either express or implied. See the LICENSE file for specific language governing
// rights and limitations of this software.
//
// If you have any questions regarding licensing, please contact us at
// info@rabbitmq.com.
package com.rabbitmq.client.test.server;
import static org.junit.Assert.assertNull;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.rabbitmq.client.MessageProperties;
import com.rabbitmq.client.test.BrokerTestCase;
import com.rabbitmq.client.test.functional.DeadLetterExchange;
import com.rabbitmq.tools.Host;
public class DeadLetterExchangeDurable extends BrokerTestCase {
@Override
protected void createResources() throws IOException {
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 5000);
args.put("x-dead-letter-exchange", DeadLetterExchange.DLX);
channel.exchangeDeclare(DeadLetterExchange.DLX, "direct", true);
channel.queueDeclare(DeadLetterExchange.DLQ, true, false, false, null);
channel.queueDeclare(DeadLetterExchange.TEST_QUEUE_NAME, true, false, false, args);
channel.queueBind(DeadLetterExchange.TEST_QUEUE_NAME, "amq.direct", "test");
channel.queueBind(DeadLetterExchange.DLQ, DeadLetterExchange.DLX, "test");
}
@Override
protected void releaseResources() throws IOException {
channel.exchangeDelete(DeadLetterExchange.DLX);
channel.queueDelete(DeadLetterExchange.DLQ);
channel.queueDelete(DeadLetterExchange.TEST_QUEUE_NAME);
}
@Test public void deadLetterQueueTTLExpiredWhileDown() throws Exception {
// This test is nonsensical (and often breaks) in HA mode.
if (HATests.HA_TESTS_RUNNING) return;
for(int x = 0; x < DeadLetterExchange.MSG_COUNT; x++) {
channel.basicPublish("amq.direct", "test", MessageProperties.MINIMAL_PERSISTENT_BASIC, "test message".getBytes());
}
closeConnection();
Host.invokeMakeTarget("stop-rabbit-on-node");
Thread.sleep(5000);
Host.invokeMakeTarget("start-rabbit-on-node");
openConnection();
openChannel();
//This has the effect of waiting for the queue to complete the
//dead lettering. Some raciness remains though since the
//dead-letter publication is async so the 'consume' below may
//reach the dlq before all dead-lettered messages have arrived
//there.
assertNull(basicGet(DeadLetterExchange.TEST_QUEUE_NAME));
DeadLetterExchange.consume(channel, "expired");
}
}