Search code examples
jmsspring-jmsspring-integration-dsl

SimpleMessageListenerContainer failed to reconnect on ems broker failover


I have 2 jms listener applications one application uses DefaultMessageListenerContainerand other application uses SimpleMessageListenerContainer

The application with DefaultMessageListenerContainer was able to reconnect on EMS broker failover, here is the log

Setup of JMS message listener invoker failed for destination 'SOME.TOPIC.T' - trying to recover. Cause: Connection is closed
Could not refresh JMS Connection for destination 'SOME.TOPIC.T' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: Failed to connect to any server at: tcp://localhost:8285,tcp://localhost:8286
Could not refresh JMS Connection for destination 'SOME.TOPIC.T' - retrying using FixedBackOff{interval=5000, currentAttempts=1, maxAttempts=unlimited}. Cause: Failed to connect to any server at: tcp://localhost:8285,tcp://localhost:8286

The application with SimpleMessageListenerContainer was not able to reconnect on EMS broker failover, here is the log

[TIBCO EMS TCPLink Reader (Server-109365)] INFO  org.springframework.jms.listener.SimpleMessageListenerContainer - Trying to recover from JMS Connection exception: javax.jms.JMSException: Connection has been terminated
[TIBCO EMS TCPLink Reader (Server-109366)] ERROR org.springframework.jms.listener.SimpleMessageListenerContainer - Encountered non-recoverable JMSException
javax.jms.JMSException: Connection has been terminated
    at com.tibco.tibjms.Tibjmsx.buildException(Tibjmsx.java:659) ~[tibjms-8.3.0.jar!/:?]
    at com.tibco.tibjms.TibjmsConnection._invokeOnExceptionCallback(TibjmsConnection.java:2118) [tibjms-8.3.0.jar!/:?]
    at com.tibco.tibjms.TibjmsConnection._onDisconnected(TibjmsConnection.java:2487) [tibjms-8.3.0.jar!/:?]
    at com.tibco.tibjms.TibjmsConnection$ServerLinkEventHandler.onEventDisconnected(TibjmsConnection.java:367) [tibjms-8.3.0.jar!/:?]
    at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.work(TibjmsxLinkTcp.java:328) [tibjms-8.3.0.jar!/:?]
    at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.run(TibjmsxLinkTcp.java:259) [tibjms-8.3.0.jar!/:?]

Both are connected to same broker instance, how to make the SimpleMessageListenerContainer listener to reconnect on JMS Exceptions?


Solution

  • The simple container is ... er ... Simple.

    It makes only one attempt to recover the connection.

    The default container is more sophisticated and configured with a BackOff (default every 5 seconds for infinite attempts).

    Use a default container if you need that sophistication, but it needs to be transactional to avoid the possibility of message loss - see the javadocs.