Skip to content

Commit 435c479

Browse files
committed
Switch JMS pooling to pooled-jms
This commit removes support for `activemq-pool` in benefit of `pooled-jms`. While the former is not JMS 2 compliant, the latter is and is independent of the ActiveMQ codebase (so potentially reusable in custom code). Closes gh-13927
1 parent fbf95b6 commit 435c479

File tree

14 files changed

+170
-125
lines changed

14 files changed

+170
-125
lines changed

Diff for: spring-boot-project/spring-boot-autoconfigure/pom.xml

+11-11
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,6 @@
183183
</exclusion>
184184
</exclusions>
185185
</dependency>
186-
<dependency>
187-
<groupId>org.apache.activemq</groupId>
188-
<artifactId>activemq-pool</artifactId>
189-
<optional>true</optional>
190-
<exclusions>
191-
<exclusion>
192-
<artifactId>geronimo-jms_1.1_spec</artifactId>
193-
<groupId>org.apache.geronimo.specs</groupId>
194-
</exclusion>
195-
</exclusions>
196-
</dependency>
197186
<dependency>
198187
<groupId>org.apache.activemq</groupId>
199188
<artifactId>artemis-jms-client</artifactId>
@@ -346,6 +335,17 @@
346335
<artifactId>jboss-transaction-spi</artifactId>
347336
<optional>true</optional>
348337
</dependency>
338+
<dependency>
339+
<groupId>org.messaginghub</groupId>
340+
<artifactId>pooled-jms</artifactId>
341+
<optional>true</optional>
342+
<exclusions>
343+
<exclusion>
344+
<groupId>org.apache.geronimo.specs</groupId>
345+
<artifactId>geronimo-jms_2.0_spec</artifactId>
346+
</exclusion>
347+
</exclusions>
348+
</dependency>
349349
<dependency>
350350
<groupId>org.mongodb</groupId>
351351
<artifactId>mongodb-driver-async</artifactId>
Original file line numberDiff line numberDiff line change
@@ -14,36 +14,37 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.autoconfigure.jms.activemq;
17+
package org.springframework.boot.autoconfigure.jms;
1818

1919
import javax.jms.ConnectionFactory;
2020

21-
import org.apache.activemq.jms.pool.PooledConnectionFactory;
21+
import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;
2222

2323
/**
24-
* Factory to create a {@link PooledConnectionFactory} from properties defined in
25-
* {@link PooledConnectionFactoryProperties}.
24+
* Factory to create a {@link JmsPoolConnectionFactory} from properties defined in
25+
* {@link JmsPoolConnectionFactoryProperties}.
2626
*
2727
* @author Stephane Nicoll
2828
* @since 2.1.0
2929
*/
30-
public class PooledConnectionFactoryFactory {
30+
public class JmsPoolConnectionFactoryFactory {
3131

32-
private final PooledConnectionFactoryProperties properties;
32+
private final JmsPoolConnectionFactoryProperties properties;
3333

34-
public PooledConnectionFactoryFactory(PooledConnectionFactoryProperties properties) {
34+
public JmsPoolConnectionFactoryFactory(
35+
JmsPoolConnectionFactoryProperties properties) {
3536
this.properties = properties;
3637
}
3738

3839
/**
39-
* Create a {@link PooledConnectionFactory} based on the specified
40+
* Create a {@link JmsPoolConnectionFactory} based on the specified
4041
* {@link ConnectionFactory}.
4142
* @param connectionFactory the connection factory to wrap
4243
* @return a pooled connection factory
4344
*/
44-
public PooledConnectionFactory createPooledConnectionFactory(
45+
public JmsPoolConnectionFactory createPooledConnectionFactory(
4546
ConnectionFactory connectionFactory) {
46-
PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory();
47+
JmsPoolConnectionFactory pooledConnectionFactory = new JmsPoolConnectionFactory();
4748
pooledConnectionFactory.setConnectionFactory(connectionFactory);
4849

4950
pooledConnectionFactory
@@ -53,14 +54,14 @@ public PooledConnectionFactory createPooledConnectionFactory(
5354
this.properties.getBlockIfFullTimeout().toMillis());
5455
}
5556
if (this.properties.getIdleTimeout() != null) {
56-
pooledConnectionFactory
57-
.setIdleTimeout((int) this.properties.getIdleTimeout().toMillis());
57+
pooledConnectionFactory.setConnectionIdleTimeout(
58+
(int) this.properties.getIdleTimeout().toMillis());
5859
}
5960
pooledConnectionFactory.setMaxConnections(this.properties.getMaxConnections());
60-
pooledConnectionFactory.setMaximumActiveSessionPerConnection(
61-
this.properties.getMaximumActiveSessionPerConnection());
61+
pooledConnectionFactory.setMaxSessionsPerConnection(
62+
this.properties.getMaxSessionsPerConnection());
6263
if (this.properties.getTimeBetweenExpirationCheck() != null) {
63-
pooledConnectionFactory.setTimeBetweenExpirationCheckMillis(
64+
pooledConnectionFactory.setConnectionCheckInterval(
6465
this.properties.getTimeBetweenExpirationCheck().toMillis());
6566
}
6667
pooledConnectionFactory
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.autoconfigure.jms.activemq;
17+
package org.springframework.boot.autoconfigure.jms;
1818

1919
import java.time.Duration;
2020

@@ -24,10 +24,10 @@
2424
* @author Stephane Nicoll
2525
* @since 2.1.0
2626
*/
27-
public class PooledConnectionFactoryProperties {
27+
public class JmsPoolConnectionFactoryProperties {
2828

2929
/**
30-
* Whether a PooledConnectionFactory should be created, instead of a regular
30+
* Whether a JmsPoolConnectionFactory should be created, instead of a regular
3131
* ConnectionFactory.
3232
*/
3333
private boolean enabled;
@@ -54,9 +54,9 @@ public class PooledConnectionFactoryProperties {
5454
private int maxConnections = 1;
5555

5656
/**
57-
* Maximum number of active sessions per connection.
57+
* Maximum number of pooled sessions per connection in the pool.
5858
*/
59-
private int maximumActiveSessionPerConnection = 500;
59+
private int maxSessionsPerConnection = 500;
6060

6161
/**
6262
* Time to sleep between runs of the idle connection eviction thread. When negative,
@@ -110,13 +110,23 @@ public void setMaxConnections(int maxConnections) {
110110
this.maxConnections = maxConnections;
111111
}
112112

113+
@Deprecated
113114
public int getMaximumActiveSessionPerConnection() {
114-
return this.maximumActiveSessionPerConnection;
115+
return getMaxSessionsPerConnection();
115116
}
116117

118+
@Deprecated
117119
public void setMaximumActiveSessionPerConnection(
118120
int maximumActiveSessionPerConnection) {
119-
this.maximumActiveSessionPerConnection = maximumActiveSessionPerConnection;
121+
setMaxSessionsPerConnection(maximumActiveSessionPerConnection);
122+
}
123+
124+
public int getMaxSessionsPerConnection() {
125+
return this.maxSessionsPerConnection;
126+
}
127+
128+
public void setMaxSessionsPerConnection(int maxSessionsPerConnection) {
129+
this.maxSessionsPerConnection = maxSessionsPerConnection;
120130
}
121131

122132
public Duration getTimeBetweenExpirationCheck() {

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQConnectionFactoryConfiguration.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@
2121
import javax.jms.ConnectionFactory;
2222

2323
import org.apache.activemq.ActiveMQConnectionFactory;
24-
import org.apache.activemq.jms.pool.PooledConnectionFactory;
2524
import org.apache.commons.pool2.PooledObject;
25+
import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;
2626

2727
import org.springframework.beans.factory.ObjectProvider;
2828
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2929
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
31+
import org.springframework.boot.autoconfigure.jms.JmsPoolConnectionFactoryFactory;
3132
import org.springframework.boot.autoconfigure.jms.JmsProperties;
3233
import org.springframework.context.annotation.Bean;
3334
import org.springframework.context.annotation.Configuration;
@@ -94,20 +95,19 @@ private ActiveMQConnectionFactory createConnectionFactory() {
9495
}
9596

9697
@Configuration
97-
@ConditionalOnClass({ PooledConnectionFactory.class, PooledObject.class })
98+
@ConditionalOnClass({ JmsPoolConnectionFactory.class, PooledObject.class })
9899
static class PooledConnectionFactoryConfiguration {
99100

100101
@Bean(destroyMethod = "stop")
101102
@ConditionalOnProperty(prefix = "spring.activemq.pool", name = "enabled", havingValue = "true", matchIfMissing = false)
102-
public PooledConnectionFactory pooledJmsConnectionFactory(
103+
public JmsPoolConnectionFactory pooledJmsConnectionFactory(
103104
ActiveMQProperties properties,
104105
ObjectProvider<List<ActiveMQConnectionFactoryCustomizer>> factoryCustomizers) {
105106
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactoryFactory(
106107
properties, factoryCustomizers.getIfAvailable())
107108
.createConnectionFactory(ActiveMQConnectionFactory.class);
108-
return new PooledConnectionFactoryFactory(properties.getPool())
109+
return new JmsPoolConnectionFactoryFactory(properties.getPool())
109110
.createPooledConnectionFactory(connectionFactory);
110-
111111
}
112112

113113
}

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQProperties.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.ArrayList;
2121
import java.util.List;
2222

23+
import org.springframework.boot.autoconfigure.jms.JmsPoolConnectionFactoryProperties;
2324
import org.springframework.boot.context.properties.ConfigurationProperties;
2425
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2526

@@ -72,7 +73,7 @@ public class ActiveMQProperties {
7273
private Duration sendTimeout = Duration.ofMillis(0);
7374

7475
@NestedConfigurationProperty
75-
private final PooledConnectionFactoryProperties pool = new PooledConnectionFactoryProperties();
76+
private final JmsPoolConnectionFactoryProperties pool = new JmsPoolConnectionFactoryProperties();
7677

7778
private final Packages packages = new Packages();
7879

@@ -132,7 +133,7 @@ public void setSendTimeout(Duration sendTimeout) {
132133
this.sendTimeout = sendTimeout;
133134
}
134135

135-
public PooledConnectionFactoryProperties getPool() {
136+
public JmsPoolConnectionFactoryProperties getPool() {
136137
return this.pool;
137138
}
138139

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisConnectionFactoryConfiguration.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
import javax.jms.ConnectionFactory;
2020

2121
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
22-
import org.apache.activemq.jms.pool.PooledConnectionFactory;
2322
import org.apache.commons.pool2.PooledObject;
23+
import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;
2424

2525
import org.springframework.beans.factory.ListableBeanFactory;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2727
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2828
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
29+
import org.springframework.boot.autoconfigure.jms.JmsPoolConnectionFactoryFactory;
2930
import org.springframework.boot.autoconfigure.jms.JmsProperties;
30-
import org.springframework.boot.autoconfigure.jms.activemq.PooledConnectionFactoryFactory;
3131
import org.springframework.context.annotation.Bean;
3232
import org.springframework.context.annotation.Configuration;
3333
import org.springframework.jms.connection.CachingConnectionFactory;
@@ -87,17 +87,17 @@ private ActiveMQConnectionFactory createConnectionFactory() {
8787
}
8888

8989
@Configuration
90-
@ConditionalOnClass({ PooledConnectionFactory.class, PooledObject.class })
90+
@ConditionalOnClass({ JmsPoolConnectionFactory.class, PooledObject.class })
9191
static class PooledConnectionFactoryConfiguration {
9292

9393
@Bean(destroyMethod = "stop")
9494
@ConditionalOnProperty(prefix = "spring.artemis.pool", name = "enabled", havingValue = "true", matchIfMissing = false)
95-
public PooledConnectionFactory pooledJmsConnectionFactory(
95+
public JmsPoolConnectionFactory pooledJmsConnectionFactory(
9696
ListableBeanFactory beanFactory, ArtemisProperties properties) {
9797
ActiveMQConnectionFactory connectionFactory = new ArtemisConnectionFactoryFactory(
9898
beanFactory, properties)
9999
.createConnectionFactory(ActiveMQConnectionFactory.class);
100-
return new PooledConnectionFactoryFactory(properties.getPool())
100+
return new JmsPoolConnectionFactoryFactory(properties.getPool())
101101
.createPooledConnectionFactory(connectionFactory);
102102
}
103103

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisProperties.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
import org.apache.activemq.artemis.core.remoting.impl.invm.TransportConstants;
2525

26-
import org.springframework.boot.autoconfigure.jms.activemq.PooledConnectionFactoryProperties;
26+
import org.springframework.boot.autoconfigure.jms.JmsPoolConnectionFactoryProperties;
2727
import org.springframework.boot.context.properties.ConfigurationProperties;
2828
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2929

@@ -65,7 +65,7 @@ public class ArtemisProperties {
6565
private final Embedded embedded = new Embedded();
6666

6767
@NestedConfigurationProperty
68-
private final PooledConnectionFactoryProperties pool = new PooledConnectionFactoryProperties();
68+
private final JmsPoolConnectionFactoryProperties pool = new JmsPoolConnectionFactoryProperties();
6969

7070
public ArtemisMode getMode() {
7171
return this.mode;
@@ -111,7 +111,7 @@ public Embedded getEmbedded() {
111111
return this.embedded;
112112
}
113113

114-
public PooledConnectionFactoryProperties getPool() {
114+
public JmsPoolConnectionFactoryProperties getPool() {
115115
return this.pool;
116116
}
117117

Diff for: spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

+12
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@
4949
"description": "Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false).",
5050
"defaultValue": true
5151
},
52+
{
53+
"name": "spring.activemq.pool.maximum-active-session-per-connection",
54+
"deprecation": {
55+
"replacement": "spring.activemq.pool.max-sessions-per-connection"
56+
}
57+
},
58+
{
59+
"name": "spring.artemis.pool.maximum-active-session-per-connection",
60+
"deprecation": {
61+
"replacement": "spring.artemis.pool.max-sessions-per-connection"
62+
}
63+
},
5264
{
5365
"name": "spring.application.admin.enabled",
5466
"type": "java.lang.Boolean",

Diff for: spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
import javax.jms.Session;
2121

2222
import org.apache.activemq.ActiveMQConnectionFactory;
23-
import org.apache.activemq.jms.pool.PooledConnectionFactory;
2423
import org.junit.Test;
24+
import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;
2525

2626
import org.springframework.beans.BeansException;
2727
import org.springframework.beans.DirectFieldAccessor;
@@ -369,8 +369,8 @@ public void testActiveMQOverriddenPool() {
369369
.withPropertyValues("spring.activemq.pool.enabled:true")
370370
.run((context) -> {
371371
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
372-
PooledConnectionFactory pool = context
373-
.getBean(PooledConnectionFactory.class);
372+
JmsPoolConnectionFactory pool = context
373+
.getBean(JmsPoolConnectionFactory.class);
374374
assertThat(jmsTemplate).isNotNull();
375375
assertThat(pool).isNotNull();
376376
assertThat(pool).isEqualTo(jmsTemplate.getConnectionFactory());
@@ -387,8 +387,8 @@ public void testActiveMQOverriddenPoolAndStandalone() {
387387
"spring.activemq.inMemory:false")
388388
.run((context) -> {
389389
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
390-
PooledConnectionFactory pool = context
391-
.getBean(PooledConnectionFactory.class);
390+
JmsPoolConnectionFactory pool = context
391+
.getBean(JmsPoolConnectionFactory.class);
392392
assertThat(jmsTemplate).isNotNull();
393393
assertThat(pool).isNotNull();
394394
assertThat(pool).isEqualTo(jmsTemplate.getConnectionFactory());
@@ -405,8 +405,8 @@ public void testActiveMQOverriddenPoolAndRemoteServer() {
405405
"spring.activemq.brokerUrl:tcp://remote-host:10000")
406406
.run((context) -> {
407407
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
408-
PooledConnectionFactory pool = context
409-
.getBean(PooledConnectionFactory.class);
408+
JmsPoolConnectionFactory pool = context
409+
.getBean(JmsPoolConnectionFactory.class);
410410
assertThat(jmsTemplate).isNotNull();
411411
assertThat(pool).isNotNull();
412412
assertThat(pool).isEqualTo(jmsTemplate.getConnectionFactory());

0 commit comments

Comments
 (0)