activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ossory <fannin...@yahoo.com>
Subject failing to close a connection leaves consumers behind that prevent new consumers receiving messages
Date Thu, 03 Jul 2008 18:18:40 GMT

Hi,
I have an issue where a JMS client attempts to receive messages from a
queue. The client fails due to a JVM crash and the JMS connection is not
closed. This leaves a consumer behind (that I can see in the ActiveMQ admin
console). If I restart the JMS client it fails to receive all of the new
messages that sent to the queue in question.
Using JMX to stop the open connections or closing ActiveMQ allows the client
to work again.
Is there a timeout value that you can apply to connections to avoid having
to do this?
Any help would be appreciated.

I've created an artificial test case based on the behaviour I have seen in
ActiveMQ 5.1 on Windows XP.
The method jmsTest2 deliberately fails to close the connection.

    static final String PROVIDER_URL = "tcp://localhost:61616";
    static final String QUEUE = "queueA";

    static void jmsTest() throws JMSException, NamingException {
        Properties props = new Properties();
        props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
        props.setProperty(Context.PROVIDER_URL, PROVIDER_URL);         
        InitialContext ctx = new InitialContext(props);
        QueueConnectionFactory cf =
(QueueConnectionFactory)ctx.lookup("ConnectionFactory");
        QueueConnection conn = cf.createQueueConnection();
        conn.start(); //this is required if you want to receive messages
using this connection
        QueueSession sess = conn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
        Queue qa = sess.createQueue(QUEUE);
        QueueSender sender = sess.createSender(qa);
        for(int i = 0; i < 10; i++) {
            Message msg = sess.createTextMessage("test");
            sender.send(msg);
        }
        sender.close();
        sess.close();
        conn.close();
    }

    static void jmsTest2() throws JMSException, NamingException {
        Properties props = new Properties();
        props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
        props.setProperty(Context.PROVIDER_URL, PROVIDER_URL);         
        InitialContext ctx = new InitialContext(props);
        QueueConnectionFactory cf =
(QueueConnectionFactory)ctx.lookup("ConnectionFactory");
        QueueConnection conn = cf.createQueueConnection();
        conn.start(); //this is required if you want to receive messages
using this connection
        QueueSession sess = conn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
        Queue qa = sess.createQueue(QUEUE);
        QueueReceiver qr = sess.createReceiver(qa);
        for(int i = 0; i < 10; i++) {
            Message msgin = qr.receive(5000);
            System.out.println("msgin" + i + " = " + msgin);
        }
        //qr.close();
        //sess.close();
        //conn.stop();
        //conn.close();
    }

   public static void main(String[] args)
   {
        jmsTest();
        jmsTest2();
        jmsTest();
        jmsTest2();
    }

The first call to jmsTest2 prints 10 messages but the second call fails to
read any messages. The JVM will not stop after the main method completes
because some ActiveMQ threads remain open.
-- 
View this message in context: http://www.nabble.com/failing-to-close-a-connection-leaves-consumers-behind-that-prevent-new-consumers-receiving-messages-tp18265444p18265444.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.


Mime
View raw message