diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java index 00ffb7ceb5e..40fb1567771 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java @@ -802,13 +802,20 @@ private boolean reconnectSessions(final RemotingConnection oldConnection, // it needs to be done on the protocol ((CoreRemotingConnection) connection).syncIDGeneratorSequence(((CoreRemotingConnection) oldConnection).getIDGeneratorSequence()); + boolean sessionFailoverError = false; for (ClientSessionInternal session : sessionsToFailover) { - if (!session.handleFailover(connection, cause)) { - return false; + if (sessionFailoverError) { + // If 1 session had a failover error, just detach the remaining sessions from the old connection so that + // they are not closed when the old connection is destroyed + session.getSessionContext().transferConnection(connection); + } else { + if (!session.handleFailover(connection, cause)) { + sessionFailoverError = true; + } } } - return true; + return !sessionFailoverError; } private void getConnectionWithRetry(final int reconnectAttempts, RemotingConnection oldConnection) { diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java index 899fc2b59a7..4e122a9c875 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java @@ -823,11 +823,15 @@ public void createQueue(QueueConfiguration queueConfiguration) throws ActiveMQEx } @Override - public boolean reattachOnNewConnection(RemotingConnection newConnection) throws ActiveMQException { - + public void transferConnection(RemotingConnection newConnection) { this.remotingConnection = newConnection; - sessionChannel.transferConnection((CoreRemotingConnection) newConnection); + } + + @Override + public boolean reattachOnNewConnection(RemotingConnection newConnection) throws ActiveMQException { + + transferConnection(newConnection); Packet request = new ReattachSessionMessage(name, sessionChannel.getLastConfirmedCommandID()); diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java index 1f6f4fbbce0..cbe9dd8b54c 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java @@ -69,6 +69,11 @@ public void setSession(ClientSessionInternal session) { public abstract int getReconnectID(); + /** + * Transfers the session context to the given newConnection on the client-side + */ + public abstract void transferConnection(RemotingConnection newConnection); + /** * it will either reattach or reconnect, preferably reattaching it. *