From 06bb6dbcff589e9745f032a9b3395afea6c92b1a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 7 Jun 2023 17:11:35 +0200 Subject: [PATCH] Release shared JMS Connection before stop completion callback Closes gh-30612 --- .../AbstractJmsListeningContainer.java | 29 +++++++++++-------- .../DefaultMessageListenerContainer.java | 12 ++++++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java index 3e30e597884..a04ebc79caf 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -205,10 +205,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess doInitialize(); } catch (JMSException ex) { - synchronized (this.sharedConnectionMonitor) { - ConnectionFactoryUtils.releaseConnection(this.sharedConnection, getConnectionFactory(), this.autoStartup); - this.sharedConnection = null; - } + releaseSharedConnection(); throw convertJmsAccessException(ex); } } @@ -248,10 +245,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess } finally { if (sharedConnectionEnabled()) { - synchronized (this.sharedConnectionMonitor) { - ConnectionFactoryUtils.releaseConnection(this.sharedConnection, getConnectionFactory(), false); - this.sharedConnection = null; - } + releaseSharedConnection(); } } } @@ -391,9 +385,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess */ protected final void refreshSharedConnection() throws JMSException { synchronized (this.sharedConnectionMonitor) { - ConnectionFactoryUtils.releaseConnection( - this.sharedConnection, getConnectionFactory(), this.sharedConnectionStarted); - this.sharedConnection = null; + releaseSharedConnection(); this.sharedConnection = createSharedConnection(); if (this.sharedConnectionStarted) { this.sharedConnection.start(); @@ -474,6 +466,19 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess } } + /** + * Release the shared Connection, if any. + * @since 6.1 + * @see ConnectionFactoryUtils#releaseConnection + */ + protected final void releaseSharedConnection() { + synchronized (this.sharedConnectionMonitor) { + ConnectionFactoryUtils.releaseConnection( + this.sharedConnection, getConnectionFactory(), this.sharedConnectionStarted); + this.sharedConnection = null; + } + } + /** * Return the shared JMS Connection maintained by this container. * Available after initialization. diff --git a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java index 4c700feffaa..b4af7eb1a49 100644 --- a/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java +++ b/spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java @@ -1245,9 +1245,15 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe private void decreaseActiveInvokerCount() { activeInvokerCount--; - if (stopCallback != null && activeInvokerCount == 0) { - stopCallback.run(); - stopCallback = null; + if (activeInvokerCount == 0) { + if (!isRunning()) { + // Proactively release shared Connection when stopped. + releaseSharedConnection(); + } + if (stopCallback != null) { + stopCallback.run(); + stopCallback = null; + } } }