Skip to content

Commit feb963e

Browse files
authored
Change default connection factory of JMS listener container to native Service Bus connection factory (#47523)
1 parent 9c5473b commit feb963e

File tree

4 files changed

+50
-77
lines changed

4 files changed

+50
-77
lines changed

sdk/spring/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
### Spring Cloud Azure Autoconfigure
66
This section includes changes in `spring-cloud-azure-autoconfigure` module.
77

8+
#### Features Added
9+
10+
- Change default connection factory of JMS listener container to native Service Bus connection factory. [#47413](https://github.com/Azure/azure-sdk-for-java/issues/47413)
11+
812
#### Bugs Fixed
913

1014
- 2 `TokenCredential` bean found in AzureServiceBusMessagingAutoConfiguration. [#47470](https://github.com/Azure/azure-sdk-for-java/pull/47470)

sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/jms/ServiceBusJmsConnectionFactoryConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,12 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
6161
BindResult<Boolean> poolEnabledResult = Binder.get(environment).bind("spring.jms.servicebus.pool.enabled", Boolean.class);
6262
BindResult<Boolean> cacheEnabledResult = Binder.get(environment).bind("spring.jms.cache.enabled", Boolean.class);
6363

64-
if (isPoolConnectionFactoryClassPresent()
65-
&& ((!cacheEnabledResult.isBound() && !poolEnabledResult.isBound()) || poolEnabledResult.orElseGet(() -> false))) {
64+
if (isPoolConnectionFactoryClassPresent() && poolEnabledResult.orElseGet(() -> false)) {
6665
registerJmsPoolConnectionFactory(registry);
6766
return;
6867
}
6968

70-
if (isCacheConnectionFactoryClassPresent() && (!cacheEnabledResult.isBound() || cacheEnabledResult.orElseGet(() -> false))) {
69+
if (isCacheConnectionFactoryClassPresent() && cacheEnabledResult.orElseGet(() -> false)) {
7170
registerJmsCachingConnectionFactory(registry);
7271
return;
7372
}

sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/jms/ServiceBusJmsAutoConfigurationTests.java

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33

44
package com.azure.spring.cloud.autoconfigure.implementation.jms;
55

6+
import com.azure.servicebus.jms.ServiceBusJmsConnectionFactory;
67
import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties;
78
import com.azure.spring.cloud.autoconfigure.implementation.jms.properties.AzureServiceBusJmsProperties;
89
import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider;
910
import com.azure.spring.cloud.core.service.AzureServiceType;
10-
import com.azure.servicebus.jms.ServiceBusJmsConnectionFactory;
1111
import jakarta.jms.ConnectionFactory;
1212
import jakarta.jms.Session;
1313
import org.apache.qpid.jms.JmsConnectionFactory;
@@ -60,6 +60,7 @@ private void testQueueJmsListenerContainerFactoryWithCustomSettings(AssertableAp
6060
assertThat(container.getMaxConcurrentConsumers()).isEqualTo(10);
6161
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 2000L);
6262
assertThat(container.isReplyPubSubDomain()).isFalse();
63+
assertThat(container.getReplyQosSettings()).isNotNull();
6364
assertThat(container.getReplyQosSettings().getPriority()).isEqualTo(1);
6465
assertThat(container.isSubscriptionDurable()).isFalse();
6566
assertThat(container.isSubscriptionShared()).isFalse();
@@ -79,14 +80,15 @@ private void testTopicJmsListenerContainerFactoryWithCustomSettings(AssertableAp
7980
assertThat(container.getMaxConcurrentConsumers()).isEqualTo(10);
8081
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 2000L);
8182
assertThat(container.isReplyPubSubDomain()).isFalse();
83+
assertThat(container.getReplyQosSettings()).isNotNull();
8284
assertThat(container.getReplyQosSettings().getPriority()).isEqualTo(1);
8385
assertThat(container.isSubscriptionDurable()).isTrue();
8486
assertThat(container.isSubscriptionShared()).isFalse();
8587
assertThat(container.getPhase()).isEqualTo(2147483647);
8688
}
8789

8890
@ParameterizedTest
89-
@ValueSource(classes = { ConnectionFactory.class, JmsConnectionFactory.class, JmsTemplate.class })
91+
@ValueSource(classes = {ConnectionFactory.class, JmsConnectionFactory.class, JmsTemplate.class})
9092
void autoconfigurationNotEnabled(Class<?> clz) {
9193
this.contextRunner
9294
.withClassLoader(new FilteredClassLoader(clz))
@@ -105,7 +107,7 @@ void contextFailedByConnectionStringNotConfigured() {
105107
}
106108

107109
@ParameterizedTest
108-
@ValueSource(strings = { "Ba", " ", "basic" })
110+
@ValueSource(strings = {"Ba", " ", "basic"})
109111
void contextFailedByPricingTierNotCorrectlyConfigured(String pricingTier) {
110112
this.contextRunner
111113
.withPropertyValues(
@@ -119,7 +121,7 @@ void contextFailedByPricingTierNotCorrectlyConfigured(String pricingTier) {
119121
}
120122

121123
@ParameterizedTest
122-
@ValueSource(strings = { "premium" })
124+
@ValueSource(strings = {"premium"})
123125
void autoconfigurationEnabledAndContextSuccessWithPremiumTier(String pricingTier) {
124126
this.contextRunner
125127
.withPropertyValues(
@@ -138,7 +140,7 @@ void autoconfigurationEnabledAndContextSuccessWithPremiumTier(String pricingTier
138140
}
139141

140142
@ParameterizedTest
141-
@ValueSource(strings = { "standard" })
143+
@ValueSource(strings = {"standard"})
142144
void autoconfigurationEnabledAndContextSuccessWithStandardTier(String pricingTier) {
143145
this.contextRunner
144146
.withPropertyValues(
@@ -157,42 +159,36 @@ void autoconfigurationEnabledAndContextSuccessWithStandardTier(String pricingTie
157159
}
158160

159161
@ParameterizedTest
160-
@ValueSource(strings = { "standard", "premium" })
162+
@ValueSource(strings = {"standard", "premium"})
161163
void autoconfigurationDisabled(String pricingTier) {
162164
this.contextRunner
163165
.withPropertyValues(
164166
"spring.jms.servicebus.enabled=false",
165167
"spring.jms.servicebus.pricing-tier=" + pricingTier,
166168
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING)
167-
.run(context -> {
168-
assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class);
169-
});
169+
.run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class));
170170
}
171171

172172
@Test
173173
void autoconfigurationDisabledCase2() {
174174
this.contextRunner
175175
.withPropertyValues(
176176
"spring.jms.servicebus.enabled=false")
177-
.run(context -> {
178-
assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class);
179-
});
177+
.run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class));
180178
}
181179

182180
@ParameterizedTest
183-
@ValueSource(strings = { "standard", "premium" })
181+
@ValueSource(strings = {"standard", "premium"})
184182
void doesNotHaveBeanOfAzureServiceBusJmsPropertiesBeanPostProcessor(String pricingTier) {
185183
this.contextRunner
186184
.withPropertyValues(
187185
"spring.jms.servicebus.pricing-tier=" + pricingTier,
188186
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING)
189-
.run(context -> {
190-
assertThat(context).doesNotHaveBean(AzureServiceBusJmsPropertiesBeanPostProcessor.class);
191-
});
187+
.run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJmsPropertiesBeanPostProcessor.class));
192188
}
193189

194190
@ParameterizedTest
195-
@ValueSource(strings = { "standard", "premium" })
191+
@ValueSource(strings = {"standard", "premium"})
196192
void doesHaveBeanOfAzureServiceBusJmsPropertiesBeanPostProcessor(String pricingTier) {
197193
this.contextRunner
198194
.withPropertyValues(
@@ -214,7 +210,7 @@ StaticConnectionStringProvider<AzureServiceType.ServiceBus> connectionStringProv
214210
}
215211

216212
@ParameterizedTest
217-
@ValueSource(strings = { "standard", "premium" })
213+
@ValueSource(strings = {"standard", "premium"})
218214
void connectionFactoryIsAutowiredIntoJmsTemplateBean(String pricingTier) {
219215
this.contextRunner
220216
.withPropertyValues(
@@ -227,7 +223,7 @@ void connectionFactoryIsAutowiredIntoJmsTemplateBean(String pricingTier) {
227223
}
228224

229225
@ParameterizedTest
230-
@ValueSource(strings = { "standard", "premium" })
226+
@ValueSource(strings = {"standard", "premium"})
231227
void jmsPropertiesConfiguredCorrectly(String pricingTier) {
232228
this.contextRunner
233229
.withPropertyValues(
@@ -251,7 +247,7 @@ void jmsPropertiesConfiguredCorrectly(String pricingTier) {
251247
}
252248

253249
@ParameterizedTest
254-
@ValueSource(strings = { "standard", "premium" })
250+
@ValueSource(strings = {"standard", "premium"})
255251
void jmsServiceBusPropertiesConfigured(String pricingTier) {
256252
this.contextRunner
257253
.withPropertyValues(
@@ -268,7 +264,7 @@ void jmsServiceBusPropertiesConfigured(String pricingTier) {
268264
}
269265

270266
@ParameterizedTest
271-
@ValueSource(strings = { "standard", "premium" })
267+
@ValueSource(strings = {"standard", "premium"})
272268
void jmsListenerContainerFactoryConfiguredCorrectly(String pricingTier) {
273269
this.contextRunner
274270
.withPropertyValues(
@@ -289,23 +285,22 @@ void jmsListenerContainerFactoryConfiguredCorrectly(String pricingTier) {
289285
});
290286
}
291287

292-
293288
@ParameterizedTest
294-
@ValueSource(strings = { "standard", "premium" })
295-
void jmsPoolConnectionFactoryBeanConfiguredAsDefault(String pricingTier) {
289+
@ValueSource(strings = {"standard", "premium"})
290+
void nativeConnectionFactoryBeanConfiguredByDefaultInJmsListenerContainerFactory(String pricingTier) {
296291
this.contextRunner
297292
.withPropertyValues(
298293
"spring.jms.servicebus.pricing-tier=" + pricingTier,
299294
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING)
300295
.run(context -> {
301-
assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class);
302-
assertThat(context).doesNotHaveBean(ServiceBusJmsConnectionFactory.class);
296+
assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class);
303297
assertThat(context).doesNotHaveBean(CachingConnectionFactory.class);
298+
assertThat(context).doesNotHaveBean(JmsPoolConnectionFactory.class);
304299
});
305300
}
306301

307302
@ParameterizedTest
308-
@ValueSource(strings = { "standard", "premium" })
303+
@ValueSource(strings = {"standard", "premium"})
309304
void jmsPoolConnectionFactoryBeanConfiguredExplicitly(String pricingTier) {
310305
this.contextRunner
311306
.withPropertyValues(
@@ -322,7 +317,7 @@ void jmsPoolConnectionFactoryBeanConfiguredExplicitly(String pricingTier) {
322317
}
323318

324319
@ParameterizedTest
325-
@ValueSource(strings = { "standard", "premium" })
320+
@ValueSource(strings = {"standard", "premium"})
326321
void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheEnable(String pricingTier) {
327322
this.contextRunner
328323
.withPropertyValues(
@@ -340,7 +335,7 @@ void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheEnable(String pricin
340335
}
341336

342337
@ParameterizedTest
343-
@ValueSource(strings = { "standard", "premium" })
338+
@ValueSource(strings = {"standard", "premium"})
344339
void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheDisable(String pricingTier) {
345340
this.contextRunner
346341
.withPropertyValues(
@@ -358,7 +353,7 @@ void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheDisable(String prici
358353
}
359354

360355
@ParameterizedTest
361-
@ValueSource(strings = { "standard", "premium" })
356+
@ValueSource(strings = {"standard", "premium"})
362357
void cachingConnectionFactoryBeanConfiguredByCacheEnable(String pricingTier) {
363358
this.contextRunner
364359
.withPropertyValues(
@@ -374,7 +369,7 @@ void cachingConnectionFactoryBeanConfiguredByCacheEnable(String pricingTier) {
374369
}
375370

376371
@ParameterizedTest
377-
@ValueSource(strings = { "standard", "premium" })
372+
@ValueSource(strings = {"standard", "premium"})
378373
void cachingConnectionFactoryBeanConfiguredByPoolDisableCacheEnable(String pricingTier) {
379374
this.contextRunner
380375
.withPropertyValues(
@@ -391,23 +386,23 @@ void cachingConnectionFactoryBeanConfiguredByPoolDisableCacheEnable(String prici
391386
}
392387

393388
@ParameterizedTest
394-
@ValueSource(strings = { "standard", "premium" })
395-
void cachingConnectionFactoryBeanConfiguredByPoolDisable(String pricingTier) {
389+
@ValueSource(strings = {"standard", "premium"})
390+
void nativeConnectionFactoryBeanConfiguredByPoolDisable(String pricingTier) {
396391
this.contextRunner
397392
.withPropertyValues(
398393
"spring.jms.servicebus.pricing-tier=" + pricingTier,
399394
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING,
400395
"spring.jms.servicebus.pool.enabled=false"
401396
)
402397
.run(context -> {
403-
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
404-
assertThat(context).doesNotHaveBean(ServiceBusJmsConnectionFactory.class);
398+
assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class);
399+
assertThat(context).doesNotHaveBean(CachingConnectionFactory.class);
405400
assertThat(context).doesNotHaveBean(JmsPoolConnectionFactory.class);
406401
});
407402
}
408403

409404
@ParameterizedTest
410-
@ValueSource(strings = { "standard", "premium" })
405+
@ValueSource(strings = {"standard", "premium"})
411406
void nativeConnectionFactoryBeanConfiguredByCacheDisable(String pricingTier) {
412407
this.contextRunner
413408
.withPropertyValues(
@@ -424,7 +419,7 @@ void nativeConnectionFactoryBeanConfiguredByCacheDisable(String pricingTier) {
424419
}
425420

426421
@ParameterizedTest
427-
@ValueSource(strings = { "standard", "premium" })
422+
@ValueSource(strings = {"standard", "premium"})
428423
void nativeConnectionFactoryBeanConfiguredByPoolDisableCacheDisable(String pricingTier) {
429424
this.contextRunner
430425
.withPropertyValues(

sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/jms/ServiceBusJmsConnectionFactoryConfigurationTests.java

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,12 @@ class ServiceBusJmsConnectionFactoryConfigurationTests {
4343

4444
@ParameterizedTest
4545
@ValueSource(strings = { "standard", "premium" })
46-
void useDefaultPoolConnection(String pricingTier) {
46+
void useDefaultNativeConnection(String pricingTier) {
4747
this.contextRunner
4848
.withPropertyValues(
4949
"spring.jms.servicebus.pricing-tier=" + pricingTier
5050
)
51-
.run(context -> {
52-
assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class);
53-
});
51+
.run(context -> assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class));
5452
}
5553

5654
@ParameterizedTest
@@ -61,36 +59,18 @@ void enablePoolConnection(String pricingTier) {
6159
"spring.jms.servicebus.pricing-tier=" + pricingTier,
6260
"spring.jms.servicebus.pool.enabled=true"
6361
)
64-
.run(context -> {
65-
assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class);
66-
});
62+
.run(context -> assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class));
6763
}
6864

6965
@ParameterizedTest
7066
@ValueSource(strings = { "org.messaginghub.pooled.jms.JmsPoolConnectionFactory", "org.apache.commons.pool2.PooledObject" })
71-
void poolEnabledButNoPoolClasses(String poolClass) {
72-
this.contextRunner
73-
.withClassLoader(new FilteredClassLoader(poolClass))
74-
.withPropertyValues(
75-
"spring.jms.servicebus.pricing-tier=premium",
76-
"spring.jms.servicebus.pool.enabled=true"
77-
)
78-
.run(context -> {
79-
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
80-
});
81-
}
82-
83-
@ParameterizedTest
84-
@ValueSource(strings = { "org.messaginghub.pooled.jms.JmsPoolConnectionFactory", "org.apache.commons.pool2.PooledObject" })
85-
void fallbackUseCachingConnectionDueNoPoolClasses(String poolClass) {
67+
void fallbackDefaultJmsConnectionDueNoPoolClasses(String poolClass) {
8668
this.contextRunner
8769
.withClassLoader(new FilteredClassLoader(poolClass))
8870
.withPropertyValues(
8971
"spring.jms.servicebus.pricing-tier=premium"
9072
)
91-
.run(context -> {
92-
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
93-
});
73+
.run(context -> assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class));
9474
}
9575

9676
@ParameterizedTest
@@ -99,11 +79,9 @@ void useCacheConnection(String pricingTier) {
9979
this.contextRunner
10080
.withPropertyValues(
10181
"spring.jms.servicebus.pricing-tier=" + pricingTier,
102-
"spring.jms.servicebus.pool.enabled=false"
82+
"spring.jms.cache.enabled=true"
10383
)
104-
.run(context -> {
105-
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
106-
});
84+
.run(context -> assertThat(context).hasSingleBean(CachingConnectionFactory.class));
10785
}
10886

10987
@ParameterizedTest
@@ -134,9 +112,7 @@ void useServiceBusJmsConnection(String pricingTier) {
134112
"spring.jms.servicebus.pool.enabled=false",
135113
"spring.jms.cache.enabled=false"
136114
)
137-
.run(context -> {
138-
assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class);
139-
});
115+
.run(context -> assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class));
140116
}
141117

142118
@ParameterizedTest
@@ -145,11 +121,10 @@ void useCacheConnectionViaAdditionConfigurationFile(String pricingTier) {
145121
this.contextRunner
146122
.withConfiguration(AutoConfigurations.of(AdditionalPropertySourceConfiguration.class))
147123
.withPropertyValues(
148-
"spring.jms.servicebus.pricing-tier=" + pricingTier
124+
"spring.jms.servicebus.pricing-tier=" + pricingTier,
125+
"spring.jms.cache.enabled=true"
149126
)
150-
.run(context -> {
151-
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
152-
});
127+
.run(context -> assertThat(context).hasSingleBean(CachingConnectionFactory.class));
153128
}
154129

155130
@Test
@@ -232,7 +207,7 @@ void cachingConnectionFactoryReusesSameProducerForSameDestination() throws Excep
232207
// Cleanup
233208
connection.close();
234209
}
235-
210+
236211
/**
237212
* Creates a ServiceBusJmsSession instance using reflection since the constructor is package-private.
238213
*/

0 commit comments

Comments
 (0)