Hello,
Could you please explain me problem/question relates to IOExceptionHandler?

On broker side, I use DefaultIOExceptionHandler, which triggers broker stop and 
throws SuppressReplyException("ShutdownBrokerInitiated", exception).

On client side I use failover transport and I have "one shared JMS connection" 
stored in Spring CachingConnectionFactory.

The problem is that sometimes (sometimes yes, sometimes no) 
SuppressReplyException("ShutdownBrokerInitiated") is
dispatched/transffered to client side as ConnectionError. If 
SuppressReplyException is transferred,
ActiveMQConnection.onException() is invoked, which finally causes that "shared 
JMS connection"
stored in Spring CachingConnectionFactory is invalidated. Then failover starts 
your work and successfully reconnects to
another instance of AMQ Broker. The problem occurs at the moment, when 
application needs JMS connection. In this moment
new FailoverTransport/Connection is created (because "shared JMS connection" is 
invalidated - null value) and AMQ Broker
rejects connection with "already connected from tcp://..." (I use jms.clientID 
in broker url).


Client side logs:

INFO {ActiveMQ Connection Executor: ...} [CachingConnectionFactory] Encountered 
a JMSException - resetting the underlying JMS Connection
javax.jms.JMSException: ShutdownBrokerInitiated
WARN {ActiveMQ Transport: ...} [FailoverTransport] Transport (tcp://...) 
failed, attempting to automatically reconnect
INFO {ActiveMQ Task-9} [FailoverTransport] Successfully reconnected to tcp://...
INFO {ActiveMQ Task-1} [FailoverTransport] Successfully connected to tcp://...
WARN ... nested exception is javax.jms.InvalidClientIDException: Broker: ... - 
Client: ... already connected from tcp://...


Question:
Should be SuppressReplyException always dispatched to client side as 
ConnectionError (by design)?

Note:
I guess (AFAIK), there is a problem related to threads concurrency, which is 
responsible for situation,
when SuppressReplyException is sometimes dispatched and sometimes not.
 - DefaultIOExceptionHandler starts the thread to stop broker
 - TransportConnection.serviceException(...) is dispatching 
SuppressReplyException only until TransportConnection is not
   "stopping" (see !stopping.get() in serviceException(...) method)
 - but TransportConnection is stopped by BrokerService.stop() method (triggered 
by DefaultIOExceptionHandler)

I still use ActiveMQ 5.16.7 (java 8), but the code seems same like in latest 
version.

Thank you for any feedback.
Radek Kraus.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@activemq.apache.org
For additional commands, e-mail: users-h...@activemq.apache.org
For further information, visit: https://activemq.apache.org/contact


Reply via email to