Hi,

When auto queue deletion is enabled (which is the default setting!) it is easy 
to lose messages.

Pre-req: Create a new artemis 2.15.0 broker with default settings.

#1 Connect a producer and consumer to a queue - address & queue will be auto 
created.
#2 Send a message from producer and receive it from consumer - works fine.
#3 Disconnect the consumer - queue now has no consumers and no messages, but 
the producer is still connected to the address.
#4 Send another message from the producer.
#5 Connect another consumer and try to receive the message from the queue.

Expected: Message can be consumed from the queue.
Actual: This will fail as there is no message on the queue to receive. There 
are no errors returned to the sender, nothing in the broker error logs, nothing 
in the DLQ.  The message is lost.

Workaround is to disable auto queue deletion in the broker address settings.
<auto-delete-queues>false</auto-delete-queues>

Related is https://issues.apache.org/jira/browse/ARTEMIS-2304 which shows a 
different set of steps to lose a message when using auto queue delete.  I have 
verified it still fails on 2.15.0 using the reproducer supplied 
(https://github.com/jnizet/artemisissue).

Is it possible to fix this or at least change the default auto-delete-queue 
setting?

Thanks
Brad

Reproducer:


@Autowired
ConnectionFactory connectionFactory;



@Test
public void shouldDeliverMessagesAfterConsumerReconnects() throws JMSException, 
InterruptedException {
    // #1 Connect a producer and consumer to a queue - address & queue will be 
auto created.
    // #2 Send a message from producer and receive it from consumer - works 
fine.
    // #3 Disconnect the consumer - queue now has no consumers and no messages, 
but the producer is still connected to the address.
    // #4 Send another message from the producer.
    // #5 Connect another consumer and try to receive the message from the 
queue.
    // Expected: Message can be consumed from the queue.
    // Actual: This will fail, there is no message to receive. There are no 
errors returned to the clients, nothing in the broker error logs, nothing in 
the DLQ.  The message is lost.

    // proper resource cleanup omitted for brevity
    String queueName = "ConsumerReconnects" + System.currentTimeMillis();
    Connection sendingConnection = connectionFactory.createConnection();
    sendingConnection.start();
    Session sendingSession = sendingConnection.createSession(true, 0);
    MessageProducer producer = 
sendingSession.createProducer(sendingSession.createQueue(queueName));

    Connection recvConnection = connectionFactory.createConnection();
    recvConnection.start();
    Session recvSession = recvConnection.createSession(true, 0);
    MessageConsumer consumer = 
recvSession.createConsumer(recvSession.createQueue(queueName));

    // send a message
    producer.send(sendingSession.createTextMessage("test 1"));
    sendingSession.commit();

    // verify it can be read OK
    Message message = consumer.receive(2000);
    assertNotNull(message);
    assertEquals("test 1", message.getBody(String.class));
    recvSession.commit();

    // now disconnect the consumer and wait a while so that the auto-delete can 
kick in
    consumer.close();
    Thread.sleep(5000);

    // send a message to the queue
    producer.send(sendingSession.createTextMessage("test 2"));
    sendingSession.commit();

    // now connect another consumer
    consumer = recvSession.createConsumer(recvSession.createQueue(queueName));
    // verify it can be read OK
    // This step will fail if queue auto deletion is not turned off
    // <auto-delete-queues>false</auto-delete-queues>
    message = consumer.receive(2000);
    assertNotNull(message);
    assertEquals("test 2", message.getBody(String.class));
    recvSession.commit();
}






The information transmitted is intended only for the person or entity to which 
it is addressed and may contain confidential and / or privileged material that 
may be governed by confidential information provisions contained in the 
agreement between GBST and your company. Any disclosure, copying, distribution, 
or other use without the express consent of the sender is prohibited. If you 
received this in error, please contact the sender and delete the material from 
any computer. All rights in the information transmitted, including copyright, 
are reserved. Nothing in this message should be interpreted as a digital 
signature that can be used to authenticate a document. No warranty is given by 
the sender that any attachments to this email are free from viruses or other 
defects.

Reply via email to