Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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 @@ -48,9 +48,7 @@ void useDefaultPoolConnection(String pricingTier) {
.withPropertyValues(
"spring.jms.servicebus.pricing-tier=" + pricingTier
)
.run(context -> {
assertThat(context).hasSingleBean(JmsPoolConnectionFactory.class);
});
.run(context -> assertThat(context).hasSingleBean(ServiceBusJmsConnectionFactory.class));
Comment thread
rujche marked this conversation as resolved.
}

@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