I have a JMS client which will subscribe messages from a JMS topic. On the JMS connection, I set an ExceptionListener so that I can detect the connection broken.
I did following testing and found some situation JMS connection exception listener can not dectect connection broken.
By default, JMS bisocket will listen on port 4457. For every JMS connection, I can find two TCP connection connecting to the port 4457. Besides that, I can find the other two TCP connection which I guess server will use to delivery messages to the clients.
1. when I [only] close TCP connection connecting to the port 4457 use some tools, indeed the ExceptionListener can detect the broken connection
2. but when I [only] close the other two TCP connection, I find:
1) JMS server will log an exception on ServerInvokerCallbackHandler. After that, it seems will never recover to delivery messages to the clients agains.
On the same handle, the session will still be live in server side, I find this from MBean [jboss.messaging:service=ServerPeer showActiveClientsAsHTML] from JMX console.
2) JMS client then can never get message from server side again and also the JMS ExceptionListener on connection can never detect connection failure
Now my questions here is:
1. for my case 2, should not the JMS server try to recovery from broken sockets to delivery messages to the JMS client again?
2. for my case 2, if expected behavior described above can not be implemented, at least JMS connection ExceptionListener should be able to detect failure so that JMS client can reconnect?