From 54d220edf309647d3f9e17854ebbda7a984dfedf Mon Sep 17 00:00:00 2001 From: Clebert Suconic Date: Fri, 28 Jul 2017 09:38:19 -0400 Subject: [PATCH] ARTEMIS-1305 Server frozen during shutdown on Resource Adapter this is a better fix than the previous one --- .../ra/ActiveMQRAManagedConnection.java | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnection.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnection.java index e53c3fd199..eee41cca19 100644 --- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnection.java +++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAManagedConnection.java @@ -221,6 +221,14 @@ public final class ActiveMQRAManagedConnection implements ManagedConnection, Exc ActiveMQRALogger.LOGGER.trace("destroyHandles()"); } + try { + if (connection != null) { + connection.stop(); + } + } catch (Throwable t) { + logger.trace("Ignored error stopping connection", t); + } + for (ActiveMQRASession session : handles) { session.destroy(); } @@ -255,7 +263,10 @@ public final class ActiveMQRAManagedConnection implements ManagedConnection, Exc } try { - connectionFactory.close(); + // we must close the ActiveMQConnectionFactory because it contains a ServerLocator + if (connectionFactory != null) { + ra.closeConnectionFactory(mcf.getProperties()); + } } catch (Exception e) { logger.debug(e.getMessage(), e); } @@ -263,10 +274,32 @@ public final class ActiveMQRAManagedConnection implements ManagedConnection, Exc destroyHandles(); try { - // we must close the ActiveMQConnectionFactory because it contains a ServerLocator - if (connectionFactory != null) { - ra.closeConnectionFactory(mcf.getProperties()); + // The following calls should not be necessary, as the connection should close the + // ClientSessionFactory, which will close the sessions. + try { + /** + * (xa|nonXA)Session.close() may NOT be called BEFORE connection.close() + *

+ * If the ClientSessionFactory is trying to fail-over or reconnect with -1 attempts, and + * one calls session.close() it may effectively dead-lock. + *

+ * connection close will close the ClientSessionFactory which will close all sessions. + */ + if (connection != null) { + connection.close(); + } + + if (nonXAsession != null) { + nonXAsession.close(); + } + + if (xaSession != null) { + xaSession.close(); + } + } catch (JMSException e) { + ActiveMQRALogger.LOGGER.debug("Error closing session " + this, e); } + } catch (Throwable e) { throw new ResourceException("Could not properly close the session and connection", e); }