Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions sdk/spring/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
### Spring Cloud Azure Autoconfigure
This section includes changes in `spring-cloud-azure-autoconfigure` module.

#### Features Added

- 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)

#### Bugs Fixed

- 2 `TokenCredential` bean found in AzureServiceBusMessagingAutoConfiguration. [#47470](https://github.com/Azure/azure-sdk-for-java/pull/47470)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,12 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BindResult<Boolean> poolEnabledResult = Binder.get(environment).bind("spring.jms.servicebus.pool.enabled", Boolean.class);
BindResult<Boolean> cacheEnabledResult = Binder.get(environment).bind("spring.jms.cache.enabled", Boolean.class);

if (isPoolConnectionFactoryClassPresent()
&& ((!cacheEnabledResult.isBound() && !poolEnabledResult.isBound()) || poolEnabledResult.orElseGet(() -> false))) {
if (isPoolConnectionFactoryClassPresent() && poolEnabledResult.orElseGet(() -> false)) {
registerJmsPoolConnectionFactory(registry);
return;
}

if (isCacheConnectionFactoryClassPresent() && (!cacheEnabledResult.isBound() || cacheEnabledResult.orElseGet(() -> false))) {
if (isCacheConnectionFactoryClassPresent() && cacheEnabledResult.orElseGet(() -> false)) {
registerJmsCachingConnectionFactory(registry);
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@

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

import com.azure.servicebus.jms.ServiceBusJmsConnectionFactory;
import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties;
import com.azure.spring.cloud.autoconfigure.implementation.jms.properties.AzureServiceBusJmsProperties;
import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider;
import com.azure.spring.cloud.core.service.AzureServiceType;
import com.azure.servicebus.jms.ServiceBusJmsConnectionFactory;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.Session;
import org.apache.qpid.jms.JmsConnectionFactory;
Expand Down Expand Up @@ -60,6 +60,7 @@ private void testQueueJmsListenerContainerFactoryWithCustomSettings(AssertableAp
assertThat(container.getMaxConcurrentConsumers()).isEqualTo(10);
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 2000L);
assertThat(container.isReplyPubSubDomain()).isFalse();
assertThat(container.getReplyQosSettings()).isNotNull();
assertThat(container.getReplyQosSettings().getPriority()).isEqualTo(1);
assertThat(container.isSubscriptionDurable()).isFalse();
assertThat(container.isSubscriptionShared()).isFalse();
Expand All @@ -79,14 +80,15 @@ private void testTopicJmsListenerContainerFactoryWithCustomSettings(AssertableAp
assertThat(container.getMaxConcurrentConsumers()).isEqualTo(10);
assertThat(container).hasFieldOrPropertyWithValue("receiveTimeout", 2000L);
assertThat(container.isReplyPubSubDomain()).isFalse();
assertThat(container.getReplyQosSettings()).isNotNull();
assertThat(container.getReplyQosSettings().getPriority()).isEqualTo(1);
assertThat(container.isSubscriptionDurable()).isTrue();
assertThat(container.isSubscriptionShared()).isFalse();
assertThat(container.getPhase()).isEqualTo(2147483647);
}

@ParameterizedTest
@ValueSource(classes = { ConnectionFactory.class, JmsConnectionFactory.class, JmsTemplate.class })
@ValueSource(classes = {ConnectionFactory.class, JmsConnectionFactory.class, JmsTemplate.class})
void autoconfigurationNotEnabled(Class<?> clz) {
this.contextRunner
.withClassLoader(new FilteredClassLoader(clz))
Expand All @@ -105,7 +107,7 @@ void contextFailedByConnectionStringNotConfigured() {
}

@ParameterizedTest
@ValueSource(strings = { "Ba", " ", "basic" })
@ValueSource(strings = {"Ba", " ", "basic"})
void contextFailedByPricingTierNotCorrectlyConfigured(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -119,7 +121,7 @@ void contextFailedByPricingTierNotCorrectlyConfigured(String pricingTier) {
}

@ParameterizedTest
@ValueSource(strings = { "premium" })
@ValueSource(strings = {"premium"})
void autoconfigurationEnabledAndContextSuccessWithPremiumTier(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -138,7 +140,7 @@ void autoconfigurationEnabledAndContextSuccessWithPremiumTier(String pricingTier
}

@ParameterizedTest
@ValueSource(strings = { "standard" })
@ValueSource(strings = {"standard"})
void autoconfigurationEnabledAndContextSuccessWithStandardTier(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -157,42 +159,36 @@ void autoconfigurationEnabledAndContextSuccessWithStandardTier(String pricingTie
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void autoconfigurationDisabled(String pricingTier) {
this.contextRunner
.withPropertyValues(
"spring.jms.servicebus.enabled=false",
"spring.jms.servicebus.pricing-tier=" + pricingTier,
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING)
.run(context -> {
assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class);
});
.run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class));
}

@Test
void autoconfigurationDisabledCase2() {
this.contextRunner
.withPropertyValues(
"spring.jms.servicebus.enabled=false")
.run(context -> {
assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class);
});
.run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJmsProperties.class));
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void doesNotHaveBeanOfAzureServiceBusJmsPropertiesBeanPostProcessor(String pricingTier) {
this.contextRunner
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=" + pricingTier,
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING)
.run(context -> {
assertThat(context).doesNotHaveBean(AzureServiceBusJmsPropertiesBeanPostProcessor.class);
});
.run(context -> assertThat(context).doesNotHaveBean(AzureServiceBusJmsPropertiesBeanPostProcessor.class));
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void doesHaveBeanOfAzureServiceBusJmsPropertiesBeanPostProcessor(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -214,7 +210,7 @@ StaticConnectionStringProvider<AzureServiceType.ServiceBus> connectionStringProv
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void connectionFactoryIsAutowiredIntoJmsTemplateBean(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -227,7 +223,7 @@ void connectionFactoryIsAutowiredIntoJmsTemplateBean(String pricingTier) {
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void jmsPropertiesConfiguredCorrectly(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -251,7 +247,7 @@ void jmsPropertiesConfiguredCorrectly(String pricingTier) {
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void jmsServiceBusPropertiesConfigured(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -268,7 +264,7 @@ void jmsServiceBusPropertiesConfigured(String pricingTier) {
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void jmsListenerContainerFactoryConfiguredCorrectly(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -289,23 +285,22 @@ void jmsListenerContainerFactoryConfiguredCorrectly(String pricingTier) {
});
}


@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
void jmsPoolConnectionFactoryBeanConfiguredAsDefault(String pricingTier) {
@ValueSource(strings = {"standard", "premium"})
void nativeConnectionFactoryBeanConfiguredByDefaultInJmsListenerContainerFactory(String pricingTier) {
this.contextRunner
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=" + pricingTier,
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING)
.run(context -> {
assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class);
assertThat(context).doesNotHaveBean(ServiceBusJmsConnectionFactory.class);
assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class);
assertThat(context).doesNotHaveBean(CachingConnectionFactory.class);
assertThat(context).doesNotHaveBean(JmsPoolConnectionFactory.class);
});
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void jmsPoolConnectionFactoryBeanConfiguredExplicitly(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -322,7 +317,7 @@ void jmsPoolConnectionFactoryBeanConfiguredExplicitly(String pricingTier) {
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheEnable(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -340,7 +335,7 @@ void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheEnable(String pricin
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheDisable(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -358,7 +353,7 @@ void jmsPoolConnectionFactoryBeanConfiguredByPoolEnableCacheDisable(String prici
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void cachingConnectionFactoryBeanConfiguredByCacheEnable(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -374,7 +369,7 @@ void cachingConnectionFactoryBeanConfiguredByCacheEnable(String pricingTier) {
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void cachingConnectionFactoryBeanConfiguredByPoolDisableCacheEnable(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -391,23 +386,23 @@ void cachingConnectionFactoryBeanConfiguredByPoolDisableCacheEnable(String prici
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
void cachingConnectionFactoryBeanConfiguredByPoolDisable(String pricingTier) {
@ValueSource(strings = {"standard", "premium"})
void nativeConnectionFactoryBeanConfiguredByPoolDisable(String pricingTier) {
this.contextRunner
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=" + pricingTier,
"spring.jms.servicebus.connection-string=" + CONNECTION_STRING,
"spring.jms.servicebus.pool.enabled=false"
)
.run(context -> {
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
assertThat(context).doesNotHaveBean(ServiceBusJmsConnectionFactory.class);
assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class);
assertThat(context).doesNotHaveBean(CachingConnectionFactory.class);
assertThat(context).doesNotHaveBean(JmsPoolConnectionFactory.class);
});
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void nativeConnectionFactoryBeanConfiguredByCacheDisable(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand All @@ -424,7 +419,7 @@ void nativeConnectionFactoryBeanConfiguredByCacheDisable(String pricingTier) {
}

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
@ValueSource(strings = {"standard", "premium"})
void nativeConnectionFactoryBeanConfiguredByPoolDisableCacheDisable(String pricingTier) {
this.contextRunner
.withPropertyValues(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,12 @@ class ServiceBusJmsConnectionFactoryConfigurationTests {

@ParameterizedTest
@ValueSource(strings = { "standard", "premium" })
void useDefaultPoolConnection(String pricingTier) {
void useDefaultNativeConnection(String pricingTier) {
this.contextRunner
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=" + pricingTier
)
.run(context -> {
assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class);
});
.run(context -> assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class));
}

@ParameterizedTest
Expand All @@ -61,36 +59,18 @@ void enablePoolConnection(String pricingTier) {
"spring.jms.servicebus.pricing-tier=" + pricingTier,
"spring.jms.servicebus.pool.enabled=true"
)
.run(context -> {
assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class);
});
.run(context -> assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class));
}

@ParameterizedTest
@ValueSource(strings = { "org.messaginghub.pooled.jms.JmsPoolConnectionFactory", "org.apache.commons.pool2.PooledObject" })
void poolEnabledButNoPoolClasses(String poolClass) {
this.contextRunner
.withClassLoader(new FilteredClassLoader(poolClass))
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=premium",
"spring.jms.servicebus.pool.enabled=true"
)
.run(context -> {
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
});
}

@ParameterizedTest
@ValueSource(strings = { "org.messaginghub.pooled.jms.JmsPoolConnectionFactory", "org.apache.commons.pool2.PooledObject" })
void fallbackUseCachingConnectionDueNoPoolClasses(String poolClass) {
void fallbackDefaultJmsConnectionDueNoPoolClasses(String poolClass) {
this.contextRunner
.withClassLoader(new FilteredClassLoader(poolClass))
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=premium"
)
.run(context -> {
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
});
.run(context -> assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class));
}

@ParameterizedTest
Expand All @@ -99,11 +79,9 @@ void useCacheConnection(String pricingTier) {
this.contextRunner
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=" + pricingTier,
"spring.jms.servicebus.pool.enabled=false"
"spring.jms.cache.enabled=true"
)
.run(context -> {
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
});
.run(context -> assertThat(context).hasSingleBean(CachingConnectionFactory.class));
}

@ParameterizedTest
Expand Down Expand Up @@ -134,9 +112,7 @@ void useServiceBusJmsConnection(String pricingTier) {
"spring.jms.servicebus.pool.enabled=false",
"spring.jms.cache.enabled=false"
)
.run(context -> {
assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class);
});
.run(context -> assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class));
}

@ParameterizedTest
Expand All @@ -145,11 +121,10 @@ void useCacheConnectionViaAdditionConfigurationFile(String pricingTier) {
this.contextRunner
.withConfiguration(AutoConfigurations.of(AdditionalPropertySourceConfiguration.class))
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=" + pricingTier
"spring.jms.servicebus.pricing-tier=" + pricingTier,
"spring.jms.cache.enabled=true"
)
.run(context -> {
assertThat(context).hasSingleBean(CachingConnectionFactory.class);
});
.run(context -> assertThat(context).hasSingleBean(CachingConnectionFactory.class));
}

@Test
Expand Down Expand Up @@ -232,7 +207,7 @@ void cachingConnectionFactoryReusesSameProducerForSameDestination() throws Excep
// Cleanup
connection.close();
}

/**
* Creates a ServiceBusJmsSession instance using reflection since the constructor is package-private.
*/
Expand Down