Skip to content

Commit cb1c847

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

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,12 @@ 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.expiredCheck()) {
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()) {
133138
LOG.trace("Connection has expired: {} and will be destroyed", connection);
134139
return false;
135140
}

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

Lines changed: 11 additions & 15 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
}
@@ -135,11 +133,8 @@ public void testFailureGetsNewConnectionOnRetry() throws Exception {
135133

136134
@Override
137135
public boolean isSatisified() throws Exception {
138-
PooledConnection newConnection = (PooledConnection) pooledConnFact.createConnection("invalid", "credentials");
139-
try {
136+
try (final PooledConnection newConnection = (PooledConnection) pooledConnFact.createConnection("invalid", "credentials")) {
140137
return connection1.getConnection() != newConnection.getConnection();
141-
} finally {
142-
newConnection.close();
143138
}
144139
}
145140
}));
@@ -237,8 +232,9 @@ public void testFailoverWithInvalidCredentials() throws Exception {
237232

238233
@Override
239234
public boolean isSatisified() throws Exception {
240-
return connection1.getConnection() !=
241-
((PooledConnection) pooledConnFact.createConnection("invalid", "credentials")).getConnection();
235+
try (final PooledConnection newConnection = (PooledConnection) pooledConnFact.createConnection("invalid", "credentials")) {
236+
return connection1.getConnection() != newConnection.getConnection();
237+
}
242238
}
243239
}));
244240

0 commit comments

Comments
 (0)