@Test
public void disconnectRedeliversMessages() throws Exception
{
Connection con = new AMQConnection("vm://:1", "guest", "guest", "consumer1", "/test");
TestableMemoryMessageStore store = (TestableMemoryMessageStore) ApplicationRegistry.getInstance().getMessageStore();
Session consumerSession = (AMQSession) con.createSession(false, Session.CLIENT_ACKNOWLEDGE);
AMQQueue queue = new AMQQueue("someQ", "someQ", false, false);
MessageConsumer consumer = consumerSession.createConsumer(queue);
//force synch to ensure the consumer has resulted in a bound queue
((AMQSession) consumerSession).declareExchangeSynch("amq.direct", "direct");
Connection con2 = new AMQConnection("vm://:1", "guest", "guest", "producer1", "/test");
Session producerSession = con2.createSession(false, Session.CLIENT_ACKNOWLEDGE);
MessageProducer producer = producerSession.createProducer(queue);
_logger.info("Sending four messages");
producer.send(producerSession.createTextMessage("msg1"));
producer.send(producerSession.createTextMessage("msg2"));
producer.send(producerSession.createTextMessage("msg3"));
producer.send(producerSession.createTextMessage("msg4"));
con2.close();
_logger.info("Starting connection");
con.start();
TextMessage tm = (TextMessage) consumer.receive();
tm.acknowledge();
_logger.info("Received and acknowledged first message");
consumer.receive();
consumer.receive();
consumer.receive();
_logger.info("Received all four messages. About to disconnect and reconnect");
con.close();
con = new AMQConnection("vm://:1", "guest", "guest", "consumer1", "/test");
consumerSession = con.createSession(false, Session.CLIENT_ACKNOWLEDGE);
consumer = consumerSession.createConsumer(queue);
_logger.info("Starting second consumer connection");
con.start();
tm = (TextMessage) consumer.receive(3000);
Assert.assertEquals("msg2", tm.getText());
tm = (TextMessage) consumer.receive(3000);
Assert.assertEquals("msg3", tm.getText());
tm = (TextMessage) consumer.receive(3000);
Assert.assertEquals("msg4", tm.getText());
_logger.info("Received redelivery of three messages. Acknowledging last message");
tm.acknowledge();
con.close();
con = new AMQConnection("vm://:1", "guest", "guest", "consumer1", "/test");
consumerSession = con.createSession(false, Session.CLIENT_ACKNOWLEDGE);
consumer = consumerSession.createConsumer(queue);
_logger.info("Starting third consumer connection");
con.start();
tm = (TextMessage) consumer.receiveNoWait();
Assert.assertNull(tm);
_logger.info("No messages redelivered as is expected");
con.close();
con = new AMQConnection("vm://:1", "guest", "guest", "consumer1", "/test");
consumerSession = con.createSession(false, Session.CLIENT_ACKNOWLEDGE);
consumer = consumerSession.createConsumer(queue);
_logger.info("Starting fourth consumer connection");
con.start();
tm = (TextMessage) consumer.receive(3000);
Assert.assertNull(tm);
_logger.info("No messages redelivered as is expected");
con.close();
_logger.info("Actually:" + store.getMessageMap().size());
// Assert.assertTrue(store.getMessageMap().size() == 0);
}