What we should probably do is to close the whole connection when you close
a session.

Session is a concept I’m trying to end anyways in the Jakarta spec. (Too
early to say )


But for now.  Can you close the connection instead ?

Clebert Suconic


On Fri, Mar 14, 2025 at 9:30 AM Marcus Ionker <marcus.ion...@retarus.com>
wrote:

> 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
>
>
>
> [image: 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 <+49%20176%2015528012>
> F +49 89 1250400-1202 <+49%2089%201250400-1202> |
> marcus.ion...@retarus.com
>
> *retarus GmbH* | Aschauer Straße 30
> <https://www.google.com/maps/search/Aschauer+Stra%C3%9Fe+30+,%0D%0A+81549+M%C3%BCnchen+,%0D%0A+Germany?entry=gmail&source=g>,
>
> <https://www.google.com/maps/search/Aschauer+Stra%C3%9Fe+30+,%0D%0A+81549+M%C3%BCnchen+,%0D%0A+Germany?entry=gmail&source=g>
> 81549
> <https://www.google.com/maps/search/Aschauer+Stra%C3%9Fe+30+,%0D%0A+81549+M%C3%BCnchen+,%0D%0A+Germany?entry=gmail&source=g>
> München
> <https://www.google.com/maps/search/Aschauer+Stra%C3%9Fe+30+,%0D%0A+81549+M%C3%BCnchen+,%0D%0A+Germany?entry=gmail&source=g>,
>
> <https://www.google.com/maps/search/Aschauer+Stra%C3%9Fe+30+,%0D%0A+81549+M%C3%BCnchen+,%0D%0A+Germany?entry=gmail&source=g>
> Germany
> <https://www.google.com/maps/search/Aschauer+Stra%C3%9Fe+30+,%0D%0A+81549+M%C3%BCnchen+,%0D%0A+Germany?entry=gmail&source=g>
> | www.retarus.com
> <https://www.retarus.com/?utm_source=footer&utm_medium=email&utm_content=weblink&utm_campaign=global-email-signature-new>
>
>
>

Reply via email to