Hello,

We were also impacted by a “Zombie” Consumer and/or Session – eg because the 
Session was closed in the Admin. Console - that causes the MessageConsumer to 
“hang” indefinitely, exactly the issue reported in 
https://issues.apache.org/jira/browse/ARTEMIS-3351. I tested this issue with 
Artemis Broker version 2.39.0 and the artemis-jms-client-all Java library 
version 2.39.0.

Here are my jndi settings.

java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
connectionFactory.ConnectionFactory=tcp://localhost:61616?retryInterval=1000&retryIntervalMultiplier=1.5&maxRetryInterval=60000&reconnectAttempts=1000
queue.queue/exampleQueue=exampleQueue

Here is the sample test code

package org.example;

import javax.jms.*;
import javax.naming.InitialContext;

public class Main {
    public static void main(String[] args) throws Exception {

        Connection connection = null;
        InitialContext initialContext = null;
        try {
            // Step 1. Create an initial context to perform the JNDI lookup.
            initialContext = new InitialContext();
            // Step 2. Perform a lookup on the queue
            Queue queue = (Queue) initialContext.lookup("queue/exampleQueue");
            // Step 3. Perform a lookup on the Connection Factory
            ConnectionFactory cf = (ConnectionFactory) 
initialContext.lookup("ConnectionFactory");
            // Step 4.Create a JMS Connection
            connection = cf.createConnection("artemis", "artemis");
            // Step 5. Create a JMS Session
            Session session = connection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
            // Step 6. Create a JMS Message Producer
            MessageProducer producer = session.createProducer(queue);
            // Step 7. Create a Text Message
            //TextMessage message = session.createTextMessage("This is a text 
message");
            //System.out.println("Sent message: " + message.getText());
            // Step 8. Send the Message
            //producer.send(message);
            // Step 9. Create a JMS Message Consumer
            MessageConsumer messageConsumer = session.createConsumer(queue);
            // Step 10. Start the Connection
            connection.start();
            // Step 11. Receive the message
            TextMessage messageReceived = (TextMessage) 
messageConsumer.receive(30000);
            if (messageReceived != null) {
                System.out.println("Received message: " + 
messageReceived.getText());
            }
        } finally {
            // Step 12. Be sure to close our JMS resources!
            if (initialContext != null) {
                initialContext.close();
            }
            if (connection != null) {
                connection.close();
            }
        }

    }
}

Based on my research I observed the following.


  *   the first time the wait(toWait) - 
https://github.com/apache/activemq-artemis/blob/2.39.0/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java#L269
 -  is called with my desired timeout. Even if the session is closed in the 
admin console code execution continues after the desired timeout
  *   then the private method private ClientMessage receive(final long timeout, 
final boolean forcingDelivery) throws ActiveMQException – ClientConsumerImpl 
line 201 – is exited and processing returns to the public method public 
ClientMessage receive(final long timeout) throws ActiveMQException - 
ClientConsumerImpl line 374.
  *   if (msg == null && !closed) is true - ClientConsumerImpl line 378 – so 
the private receive method is called again with timeout = 0 and 
forcingDelivery=true.
  *   Now while ((stopped || (m = buffer.poll()) == null) && !closed && toWait 
> 0) - ClientConsumerImpl line251 – is entered once and then exited at 
ClientConsumerImpl line 262
  *   The forceDelivery is executed at ClientConsumerImpl line 305
  *   The while loop at ClientConsumerImpl line 247 is executed again and the 
wait(toWait) is executed with Long.MAX_VALUE.
  *   The consumer now waits virtually “forever” and the forceDelivery response 
from the server never arrives.

I hope I may have helped to address this issue – Artemis-3351.

Best Regards,
Marcus



[Retarus 
Logo]<https://www.retarus.com/?utm_source=footer&utm_medium=email&utm_content=weblink&utm_campaign=global-email-signature-new>

Marcus Ionker | Senior Product Evangelist, Messaging | M +49 176 
15528012<tel:+49%20176%2015528012>
F +49 89 1250400-1202<tel:+49%2089%201250400-1202> | 
marcus.ion...@retarus.com<mailto:marcus.ion...@retarus.com>

retarus GmbH | Aschauer Straße 30, 81549 München, Germany | 
www.retarus.com<https://www.retarus.com/?utm_source=footer&utm_medium=email&utm_content=weblink&utm_campaign=global-email-signature-new>


Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to