Skip to content

Commit d351d0e

Browse files
committed
[AMQ-9820]: closed connections leaking into the pool when reconnectOnException is used
1 parent 00a5352 commit d351d0e

3 files changed

Lines changed: 18 additions & 20 deletions

File tree

activemq-jms-pool/src/main/java/org/apache/activemq/jms/pool/ConnectionPool.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ public void start() throws JMSException {
125125
connection.start();
126126
} catch (JMSException e) {
127127
started.set(false);
128+
setHasExpired(true);
128129
if (isReconnectOnException()) {
129130
close();
130131
}

activemq-jms-pool/src/main/java/org/apache/activemq/jms/pool/PooledConnectionFactory.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,7 @@ public void destroyObject(ConnectionKey connectionKey, PooledObject<ConnectionPo
129129
@Override
130130
public boolean validateObject(ConnectionKey connectionKey, PooledObject<ConnectionPool> pooledObject) {
131131
ConnectionPool connection = pooledObject.getObject();
132-
if (connection == null || connection.getConnection() == null) {
133-
LOG.trace("Connection has been closed and will be destroyed: {}", connection);
134-
return false;
135-
}
136-
137-
if (connection.expiredCheck()) {
132+
if (connection != null && connection.expiredCheck()) {
138133
LOG.trace("Connection has expired: {} and will be destroyed", connection);
139134
return false;
140135
}

activemq-jms-pool/src/test/java/org/apache/activemq/jms/pool/PooledConnectionSecurityExceptionTest.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,13 @@
1616
*/
1717
package org.apache.activemq.jms.pool;
1818

19-
import static org.junit.Assert.assertNotSame;
20-
import static org.junit.Assert.assertTrue;
21-
import static org.junit.Assert.fail;
22-
23-
import java.util.ArrayList;
24-
import java.util.List;
25-
2619
import jakarta.jms.Connection;
2720
import jakarta.jms.ExceptionListener;
2821
import jakarta.jms.JMSException;
2922
import jakarta.jms.JMSSecurityException;
3023
import jakarta.jms.MessageProducer;
3124
import jakarta.jms.Queue;
3225
import jakarta.jms.Session;
33-
3426
import org.apache.activemq.ActiveMQConnectionFactory;
3527
import org.apache.activemq.broker.BrokerPlugin;
3628
import org.apache.activemq.broker.BrokerService;
@@ -50,6 +42,13 @@
5042
import org.slf4j.Logger;
5143
import org.slf4j.LoggerFactory;
5244

45+
import java.util.ArrayList;
46+
import java.util.List;
47+
48+
import static org.junit.Assert.assertNotSame;
49+
import static org.junit.Assert.assertTrue;
50+
import static org.junit.Assert.fail;
51+
5352
/**
5453
* Test Pooled connections ability to handle security exceptions
5554
*/
@@ -112,7 +111,6 @@ public void onException(JMSException exception) {
112111
@Test
113112
public void testFailureGetsNewConnectionOnRetryLooped() throws Exception {
114113
for (int i = 0; i < 10; ++i) {
115-
LOG.info("Iteration: {}", i);
116114
testFailureGetsNewConnectionOnRetry();
117115
}
118116
}
@@ -136,13 +134,15 @@ public void testFailureGetsNewConnectionOnRetry() throws Exception {
136134
@Override
137135
public boolean isSatisified() throws Exception {
138136
try (final PooledConnection newConnection = (PooledConnection) pooledConnFact.createConnection("invalid", "credentials")) {
139-
return connection1.getConnection() != newConnection.getConnection();
137+
return connection1.pool != ((PooledConnection)newConnection).pool;
138+
} catch (Exception e) {
139+
return false;
140140
}
141141
}
142142
}));
143143

144144
final PooledConnection connection2 = (PooledConnection) pooledConnFact.createConnection("invalid", "credentials");
145-
assertNotSame(connection1.getConnection(), connection2.getConnection());
145+
assertNotSame(connection1.pool, connection2.pool);
146146

147147
try {
148148
connection2.start();
@@ -235,13 +235,15 @@ public void testFailoverWithInvalidCredentials() throws Exception {
235235
@Override
236236
public boolean isSatisified() throws Exception {
237237
try (final PooledConnection newConnection = (PooledConnection) pooledConnFact.createConnection("invalid", "credentials")) {
238-
return connection1.getConnection() != newConnection.getConnection();
238+
return connection1.pool != ((PooledConnection)newConnection).pool;
239+
} catch (Exception e) {
240+
return false;
239241
}
240242
}
241243
}));
242244

243245
final PooledConnection connection2 = (PooledConnection) pooledConnFact.createConnection("invalid", "credentials");
244-
assertNotSame(connection1.getConnection(), connection2.getConnection());
246+
assertNotSame(connection1.pool, connection2.pool);
245247

246248
try {
247249
connection2.start();
@@ -412,4 +414,4 @@ protected BrokerPlugin configureAuthorization() throws Exception {
412414

413415
return authorizationPlugin;
414416
}
415-
}
417+
}

0 commit comments

Comments
 (0)