I had this same problem since 4.1.0-incubator. Learned to make killing off
the dead consumers in jconsole as part of my morning routine. Glad you put a
test case. I hope this will get fixed. I took your post and setup an Issue:
AMQ-1850.
Ossory wrote:
>
> 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-tp18265444p18372602.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.