Leaks in pinger when using manual reconnection?
jmesnil Aug 6, 2009 8:00 AM== Setup ==
* 1 single server (no backup)
* JMS Connection Factory configured with:
<retry-interval>1000</retry-interval> <retry-interval-multiplier>1.0</retry-interval-multiplier> <reconnect-attempts>-1</reconnect-attempts> <failover-on-server-shutdown>true</failover-on-server-shutdown> <call-timeout>5000</call-timeout>
With this configuration, clients will try to reconnect indefinitely on the single server.
* One JMS ExceptionListener for manual reconnection:
private ExceptionListener exceptionListener = new ExceptionListener() { public void onException(JMSException arg0) { System.out.println("TopicExample.onException()"); disconnect(); reconnect(); } };
disconnect() closes the current JMS connection (if any)
reconnect() recreates all the JMS resources from JNDI
* The client registers a MessageListener (to print received messages) and send messages every 0.5s
I've added traces in the Pinger handlePacket() method to display when pings where received for which remoting connections.
== Steps ==
1. start the server
2. start the client
=> On the client, we create 2 remoting connections (1 when calling JMS cf.createConnection(), the other when calling JMS conn.createSession())
=> We receive pings for these 2 remoting connections
3. kills the server
=> On the client, the connection failure is detected:
6 aout 2009 13:29:57 org.jboss.messaging.core.logging.Logger warn ATTENTION: Connection failure has been detected The connection was closed by the server:5 6 aout 2009 13:29:57 org.jboss.messaging.core.logging.Logger warn ATTENTION: Connection failure has been detected The connection was closed by the server:5
4. Restart the server
=> On the client, we try to reattach the sessions to the servers. This code creates new RemotingConnections *and new Pingers*
6 ao?t 2009 13:30:28 org.jboss.messaging.core.logging.Logger warn ATTENTION: 9342944 Session not found on server when attempting to re-attach 6 ao?t 2009 13:30:28 org.jboss.messaging.core.logging.Logger warn ATTENTION: 11968595 Session not found on server when attempting to re-attach
5. Client's JMS ExceptionListener is called
=> when we try to close the current connection, it fails:
javax.jms.JMSException: Timed out waiting for response when sending packet 74 at org.jboss.messaging.core.remoting.impl.ChannelImpl.sendBlocking(ChannelImpl.java:328) at org.jboss.messaging.core.client.impl.ClientConsumerImpl.doCleanUp(ClientConsumerImpl.java:753) at org.jboss.messaging.core.client.impl.ClientConsumerImpl.close(ClientConsumerImpl.java:318) at org.jboss.messaging.jms.client.JBossMessageConsumer.close(JBossMessageConsumer.java:153) at org.jboss.messaging.jms.client.JBossSession.close(JBossSession.java:275) at org.jboss.messaging.jms.client.JBossConnection.close(JBossConnection.java:259) at org.jboss.jms.example.TopicExample.disconnect(TopicExample.java:112) at org.jboss.jms.example.TopicExample$2.onException(TopicExample.java:69) at org.jboss.messaging.jms.client.JBossConnection$JMSFailureListener.connectionFailed(JBossConnection.java:545) at org.jboss.messaging.core.remoting.impl.RemotingConnectionImpl.callFailureListeners(RemotingConnectionImpl.java:402) at org.jboss.messaging.core.remoting.impl.RemotingConnectionImpl.fail(RemotingConnectionImpl.java:244) at org.jboss.messaging.core.client.impl.ConnectionManagerImpl$Channel0Handler$1.run(ConnectionManagerImpl.java:1119) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676) at java.lang.Thread.run(Thread.java:613) Caused by: MessagingException[errorCode=3 message=Timed out waiting for response when sending packet 74] ... 15 more
5b. Still in the JMS ExceptionListener, we reconnect to the Server starting from JNDI resources. This creates new RemotingConnections *and new Pingers*
6. The client can once again produce and consume messages
*but* the client receives pings for 4 connections!
It receives pings for the 2 remoting connections which were created when reconnecting.
But it also receives pings for the 2 remoting connections which were created when reattaching the session at step #4.
The exception at step #5 prevented the JMS connection to be closed properly, including closing its associated remoting connection(s) and its pinger(s)
If I kill/restart the server once more, I have now 6 pingers on the client.