public void TestFailoverToAnotherExclusiveConsumerCreatedFirst()
{
IConnection conn = createConnection(true);
ISession exclusiveSession1 = null;
ISession exclusiveSession2 = null;
ISession fallbackSession = null;
ISession senderSession = null;
purgeQueue(conn, new ActiveMQQueue("TEST.QUEUE2"));
try
{
exclusiveSession1 = conn.CreateSession(AcknowledgementMode.AutoAcknowledge);
exclusiveSession2 = conn.CreateSession(AcknowledgementMode.AutoAcknowledge);
fallbackSession = conn.CreateSession(AcknowledgementMode.AutoAcknowledge);
senderSession = conn.CreateSession(AcknowledgementMode.AutoAcknowledge);
// This creates the exclusive consumer first which avoids AMQ-1024
// bug.
ActiveMQQueue exclusiveQueue = new ActiveMQQueue("TEST.QUEUE2?consumer.exclusive=true");
IMessageConsumer exclusiveConsumer1 = exclusiveSession1.CreateConsumer(exclusiveQueue);
IMessageConsumer exclusiveConsumer2 = exclusiveSession2.CreateConsumer(exclusiveQueue);
ActiveMQQueue fallbackQueue = new ActiveMQQueue("TEST.QUEUE2");
IMessageConsumer fallbackConsumer = fallbackSession.CreateConsumer(fallbackQueue);
ActiveMQQueue senderQueue = new ActiveMQQueue("TEST.QUEUE2");
IMessageProducer producer = senderSession.CreateProducer(senderQueue);
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
IMessage msg = senderSession.CreateTextMessage("test");
producer.Send(msg);
Thread.Sleep(500);
// Verify exclusive consumer receives the message.
Assert.IsNotNull(exclusiveConsumer1.Receive(TimeSpan.FromMilliseconds(1000)));
Assert.IsNull(exclusiveConsumer2.Receive(TimeSpan.FromMilliseconds(1000)));
Assert.IsNull(fallbackConsumer.Receive(TimeSpan.FromMilliseconds(1000)));
// Close the exclusive consumer to verify the non-exclusive consumer
// takes over
exclusiveConsumer1.Close();
producer.Send(msg);
producer.Send(msg);
Assert.IsNotNull(exclusiveConsumer2.Receive(TimeSpan.FromMilliseconds(1000)));
Assert.IsNull(fallbackConsumer.Receive(TimeSpan.FromMilliseconds(1000)));
}
finally
{
fallbackSession.Close();
senderSession.Close();
conn.Close();
}
}