package com.rabbitmq.client.test;
import com.rabbitmq.client.*;
import com.rabbitmq.client.impl.nio.NioParams;
import org.junit.Test;
import java.io.IOException;
import java.util.concurrent.*;
import static org.junit.Assert.assertTrue;
/**
*
*/
public class JavaNioTest {
@Test
public void connection() throws Exception {
CountDownLatch latch = new CountDownLatch(1);
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.useNio();
Connection connection = null;
try {
connection = basicGetBasicConsume(connectionFactory, "nio.queue", latch);
boolean messagesReceived = latch.await(5, TimeUnit.SECONDS);
assertTrue("Message has not been received", messagesReceived);
} finally {
safeClose(connection);
}
}
@Test
public void twoConnections() throws IOException, TimeoutException, InterruptedException {
CountDownLatch latch = new CountDownLatch(2);
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.useNio();
connectionFactory.setNioParams(new NioParams().setNbIoThreads(4));
Connection connection1 = null;
Connection connection2 = null;
try {
connection1 = basicGetBasicConsume(connectionFactory, "nio.queue.1", latch);
connection2 = basicGetBasicConsume(connectionFactory, "nio.queue.2", latch);
boolean messagesReceived = latch.await(5, TimeUnit.SECONDS);
assertTrue("Messages have not been received", messagesReceived);
} finally {
safeClose(connection1);
safeClose(connection2);
}
}
@Test
public void twoConnectionsWithNioExecutor() throws IOException, TimeoutException, InterruptedException {
CountDownLatch latch = new CountDownLatch(2);
ExecutorService nioExecutor = Executors.newFixedThreadPool(5);
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.useNio();
Connection connection1 = null;
Connection connection2 = null;
try {
connection1 = basicGetBasicConsume(connectionFactory, "nio.queue.1", latch);
connection2 = basicGetBasicConsume(connectionFactory, "nio.queue.2", latch);
boolean messagesReceived = latch.await(5, TimeUnit.SECONDS);
assertTrue("Messages have not been received", messagesReceived);
} finally {
safeClose(connection1);
safeClose(connection2);
nioExecutor.shutdownNow();
}
}
@Test
public void shutdownListenerCalled() throws IOException, TimeoutException, InterruptedException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.useNio();
Connection connection = connectionFactory.newConnection();
try {
final CountDownLatch latch = new CountDownLatch(1);
connection.addShutdownListener(new ShutdownListener() {
@Override
public void shutdownCompleted(ShutdownSignalException cause) {
latch.countDown();
}
});
safeClose(connection);
assertTrue("Shutdown listener should have been called", latch.await(5, TimeUnit.SECONDS));
} finally {
safeClose(connection);
}
}
@Test
public void nioLoopCleaning() throws Exception {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.useNio();
for(int i = 0; i < 10; i++) {
Connection connection = connectionFactory.newConnection();
connection.abort();
}
}
private Connection basicGetBasicConsume(ConnectionFactory connectionFactory, String queue, final CountDownLatch latch)
throws IOException, TimeoutException {
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(queue, false, false, false, null);
channel.queuePurge(queue);
channel.basicPublish("", queue, null, new byte[20000]);
channel.basicConsume(queue, false, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
getChannel().basicAck(envelope.getDeliveryTag(), false);
latch.countDown();
}
});
return connection;
}
private void safeClose(Connection connection) {
if (connection != null) {
try {
connection.abort();
} catch (Exception e) {
// OK
}
}
}
}