From 70ad6064bdc0e1eac33409946872feefaab61498 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Feb 2026 07:50:33 +0000 Subject: [PATCH 01/31] Initial plan From 04638feaadd1447671239ba86e11401f5665724d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Feb 2026 07:56:24 +0000 Subject: [PATCH 02/31] Add EventHubs ConnectionDetails support for autoconfigure, testcontainers, and docker-compose Co-authored-by: rujche <171773178+rujche@users.noreply.github.com> --- .../AzureEventHubsAutoConfiguration.java | 21 ++------ .../AzureEventHubsConnectionDetails.java | 12 +++++ ...AzureEventHubsPropertiesConfiguration.java | 15 ++++++ ...onfigurationWithConnectionDetailsBean.java | 46 ++++++++++++++++++ ...igurationWithoutConnectionDetailsBean.java | 32 +++++++++++++ .../spring-cloud-azure-docker-compose/pom.xml | 6 +++ ...DockerComposeConnectionDetailsFactory.java | 48 +++++++++++++++++++ .../main/resources/META-INF/spring.factories | 3 +- .../spring-cloud-azure-testcontainers/pom.xml | 6 +++ ...HubsContainerConnectionDetailsFactory.java | 34 +++++++++++++ .../main/resources/META-INF/spring.factories | 3 +- 11 files changed, 206 insertions(+), 20 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsConnectionDetails.java create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsPropertiesConfiguration.java create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithConnectionDetailsBean.java create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java create mode 100644 sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactory.java create mode 100644 sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactory.java diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java index 13aef3712767..0e2c637a8d8a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java @@ -4,10 +4,8 @@ package com.azure.spring.cloud.autoconfigure.implementation.eventhubs; import com.azure.messaging.eventhubs.EventHubClientBuilder; -import com.azure.spring.cloud.autoconfigure.implementation.AzureServiceConfigurationBase; -import com.azure.spring.cloud.autoconfigure.implementation.condition.ConditionalOnAnyProperty; -import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsProperties; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsPropertiesConfiguration; import com.azure.spring.cloud.core.provider.connectionstring.ServiceConnectionStringProvider; import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider; import com.azure.spring.cloud.core.service.AzureServiceType; @@ -15,8 +13,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; @@ -26,26 +22,15 @@ * @since 4.0.0 */ @ConditionalOnClass(EventHubClientBuilder.class) -@ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.enabled", havingValue = "true", matchIfMissing = true) -@ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = { "connection-string", "namespace" }) @Import({ + AzureEventHubsPropertiesConfiguration.class, AzureEventHubsClientBuilderConfiguration.class, AzureEventHubsConsumerClientConfiguration.class, AzureEventHubsProducerClientConfiguration.class, AzureBlobCheckpointStoreConfiguration.class, AzureEventHubsProcessorClientConfiguration.class }) -public class AzureEventHubsAutoConfiguration extends AzureServiceConfigurationBase { - - AzureEventHubsAutoConfiguration(AzureGlobalProperties azureGlobalProperties) { - super(azureGlobalProperties); - } - - @Bean - @ConfigurationProperties(AzureEventHubsProperties.PREFIX) - AzureEventHubsProperties azureEventHubsProperties() { - return loadProperties(getAzureGlobalProperties(), new AzureEventHubsProperties()); - } +public class AzureEventHubsAutoConfiguration { @Bean @ConditionalOnExpression("'${spring.cloud.azure.eventhubs.connection-string:}' != ''") diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsConnectionDetails.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsConnectionDetails.java new file mode 100644 index 000000000000..9d68aa05b60e --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsConnectionDetails.java @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties; + +import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails; + +public interface AzureEventHubsConnectionDetails extends ConnectionDetails { + + String getConnectionString(); + +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsPropertiesConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsPropertiesConfiguration.java new file mode 100644 index 000000000000..b44c3ba37eb2 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/AzureEventHubsPropertiesConfiguration.java @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Import; + +@Import({ + ConfigurationWithConnectionDetailsBean.class, + ConfigurationWithoutConnectionDetailsBean.class, +}) +@EnableConfigurationProperties +public class AzureEventHubsPropertiesConfiguration { +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithConnectionDetailsBean.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithConnectionDetailsBean.java new file mode 100644 index 000000000000..7eeea4a62f26 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithConnectionDetailsBean.java @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties; + +import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.implementation.properties.utils.AzureGlobalPropertiesUtils; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails; +import org.springframework.boot.context.properties.bind.BindResult; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; + +@ConditionalOnClass(ConnectionDetails.class) +@ConditionalOnBean(AzureEventHubsConnectionDetails.class) +class ConfigurationWithConnectionDetailsBean { + + private final Environment environment; + private final AzureGlobalProperties globalProperties; + private final AzureEventHubsConnectionDetails connectionDetails; + + ConfigurationWithConnectionDetailsBean( + Environment environment, + AzureGlobalProperties globalProperties, + AzureEventHubsConnectionDetails connectionDetails) { + this.environment = environment; + this.globalProperties = globalProperties; + this.connectionDetails = connectionDetails; + } + + @Bean + AzureEventHubsProperties azureEventHubsProperties() { + AzureEventHubsProperties propertiesLoadFromGlobalProperties = + AzureGlobalPropertiesUtils.loadProperties(globalProperties, new AzureEventHubsProperties()); + BindResult bindResult = Binder.get(environment) + .bind(AzureEventHubsProperties.PREFIX, Bindable.ofInstance(propertiesLoadFromGlobalProperties)); + AzureEventHubsProperties properties = bindResult.isBound() ? bindResult.get() + : propertiesLoadFromGlobalProperties; + properties.setConnectionString(connectionDetails.getConnectionString()); + return properties; + } + +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java new file mode 100644 index 000000000000..9e0dbc1537c2 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties; + +import com.azure.spring.cloud.autoconfigure.implementation.condition.ConditionalOnAnyProperty; +import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.implementation.properties.utils.AzureGlobalPropertiesUtils; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; + +@ConditionalOnMissingBean(type = "com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails") +@ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = {"connection-string", "namespace"}) +class ConfigurationWithoutConnectionDetailsBean { + + private final AzureGlobalProperties azureGlobalProperties; + + ConfigurationWithoutConnectionDetailsBean(AzureGlobalProperties azureGlobalProperties) { + this.azureGlobalProperties = azureGlobalProperties; + } + + @Bean + @ConditionalOnMissingBean + @ConfigurationProperties(AzureEventHubsProperties.PREFIX) + AzureEventHubsProperties azureEventHubsProperties() { + return AzureGlobalPropertiesUtils.loadProperties(azureGlobalProperties, new AzureEventHubsProperties()); + } + +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml index c4c037489ffa..73c801c5ec93 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml +++ b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml @@ -83,6 +83,12 @@ 7.17.17 true + + com.azure + azure-messaging-eventhubs + 5.20.0 + true + org.springframework.boot diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactory.java new file mode 100644 index 000000000000..cfe5efbb30c6 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactory.java @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.docker.compose.implementation.service.connection.eventhubs; + +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; +import org.springframework.boot.docker.compose.core.RunningService; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionDetailsFactory; +import org.springframework.boot.docker.compose.service.connection.DockerComposeConnectionSource; + +class EventHubsDockerComposeConnectionDetailsFactory + extends DockerComposeConnectionDetailsFactory { + + private static final int EVENT_HUBS_PORT = 5672; + + protected EventHubsDockerComposeConnectionDetailsFactory() { + super("azure-messaging/eventhubs-emulator"); + } + + @Override + protected AzureEventHubsConnectionDetails getDockerComposeConnectionDetails(DockerComposeConnectionSource source) { + return new EventHubsContainerConnectionDetails(source.getRunningService()); + } + + /** + * {@link AzureEventHubsConnectionDetails} backed by an {@code Event Hubs} + * {@link RunningService}. + */ + private static class EventHubsContainerConnectionDetails extends DockerComposeConnectionDetails + implements AzureEventHubsConnectionDetails { + + private final String host; + + private final int port; + + EventHubsContainerConnectionDetails(RunningService service) { + super(service); + this.host = service.host(); + this.port = service.ports().get(EVENT_HUBS_PORT); + } + + @Override + public String getConnectionString() { + return "Endpoint=sb://%s:%d;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;" + .formatted(this.host, this.port); + } + } +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories b/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories index 6de8408e5b64..34751950da36 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories @@ -1,4 +1,5 @@ org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFactory=\ com.azure.spring.cloud.docker.compose.implementation.service.connection.bus.ServiceBusDockerComposeConnectionDetailsFactory,\ com.azure.spring.cloud.docker.compose.implementation.service.connection.storage.StorageBlobDockerComposeConnectionDetailsFactory,\ -com.azure.spring.cloud.docker.compose.implementation.service.connection.storage.StorageQueueDockerComposeConnectionDetailsFactory +com.azure.spring.cloud.docker.compose.implementation.service.connection.storage.StorageQueueDockerComposeConnectionDetailsFactory,\ +com.azure.spring.cloud.docker.compose.implementation.service.connection.eventhubs.EventHubsDockerComposeConnectionDetailsFactory diff --git a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml index 5a381271d750..5c198eaf7a9e 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml +++ b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml @@ -90,6 +90,12 @@ 7.1.0-beta.1 test + + com.azure + azure-messaging-eventhubs + 5.20.0 + true + org.springframework.boot diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactory.java new file mode 100644 index 000000000000..e76e5b9065b0 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactory.java @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.testcontainers.implementation.service.connection.eventhubs; + +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; +import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory; +import org.springframework.boot.testcontainers.service.connection.ContainerConnectionSource; +import org.testcontainers.azure.EventHubsEmulatorContainer; + +class EventHubsContainerConnectionDetailsFactory + extends ContainerConnectionDetailsFactory { + + @Override + protected AzureEventHubsConnectionDetails getContainerConnectionDetails(ContainerConnectionSource source) { + return new EventHubsContainerConnectionDetails(source); + } + + /** + * {@link AzureEventHubsConnectionDetails} backed by a {@link ContainerConnectionSource}. + */ + private static class EventHubsContainerConnectionDetails extends ContainerConnectionDetails + implements AzureEventHubsConnectionDetails { + + EventHubsContainerConnectionDetails(ContainerConnectionSource source) { + super(source); + } + + @Override + public String getConnectionString() { + return getContainer().getConnectionString(); + } + } +} diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories b/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories index 8d3008a6217a..6fe8e65243ee 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories @@ -2,4 +2,5 @@ org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFacto com.azure.spring.cloud.testcontainers.implementation.service.connection.cosmos.CosmosContainerConnectionDetailsFactory,\ com.azure.spring.cloud.testcontainers.implementation.service.connection.bus.ServiceBusContainerConnectionDetailsFactory,\ com.azure.spring.cloud.testcontainers.implementation.service.connection.storage.StorageBlobContainerConnectionDetailsFactory,\ -com.azure.spring.cloud.testcontainers.implementation.service.connection.storage.StorageQueueContainerConnectionDetailsFactory +com.azure.spring.cloud.testcontainers.implementation.service.connection.storage.StorageQueueContainerConnectionDetailsFactory,\ +com.azure.spring.cloud.testcontainers.implementation.service.connection.eventhubs.EventHubsContainerConnectionDetailsFactory From 2acc1c160235beccaac92dcebf6784d81ad4b879 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Feb 2026 07:59:02 +0000 Subject: [PATCH 03/31] Add test cases for EventHubs ConnectionDetails support Co-authored-by: rujche <171773178+rujche@users.noreply.github.com> --- .../AzureEventHubsAutoConfigurationTests.java | 16 +++++ ...CustomAzureEventHubsConnectionDetails.java | 16 +++++ ...rComposeConnectionDetailsFactoryTests.java | 54 ++++++++++++++++ .../service/connection/eventhubs/Config.json | 22 +++++++ .../eventhubs/eventhubs-compose.yaml | 17 +++++ ...ontainerConnectionDetailsFactoryTests.java | 62 +++++++++++++++++++ .../src/test/resources/eventhubs/Config.json | 22 +++++++ 7 files changed, 209 insertions(+) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/CustomAzureEventHubsConnectionDetails.java create mode 100644 sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java create mode 100644 sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json create mode 100644 sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml create mode 100644 sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java create mode 100644 sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java index 367ac4cdb26e..0f410bb7b6d2 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java @@ -280,4 +280,20 @@ void configurationPropertiesShouldBind() { }); } + @Test + void configureWithConnectionDetails() { + String connectionString = String.format(CONNECTION_STRING_FORMAT, "test-namespace"); + this.contextRunner + .withPropertyValues( + "spring.cloud.azure.eventhubs.connection-string=" + connectionString + ) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) + .withBean(com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails.class, CustomAzureEventHubsConnectionDetails::new) + .run(context -> { + assertThat(context).hasSingleBean(AzureEventHubsProperties.class); + AzureEventHubsProperties properties = context.getBean(AzureEventHubsProperties.class); + assertEquals(CustomAzureEventHubsConnectionDetails.CONNECTION_STRING, properties.getConnectionString()); + }); + } + } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/CustomAzureEventHubsConnectionDetails.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/CustomAzureEventHubsConnectionDetails.java new file mode 100644 index 000000000000..d5faa229ef11 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/CustomAzureEventHubsConnectionDetails.java @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.autoconfigure.implementation.eventhubs; + +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; + +public class CustomAzureEventHubsConnectionDetails implements AzureEventHubsConnectionDetails { + + static final String CONNECTION_STRING = "Endpoint=sb://connection-detail-namespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=test-key;EntityPath=test-eventhub"; + + @Override + public String getConnectionString() { + return CONNECTION_STRING; + } +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java new file mode 100644 index 000000000000..70a8d0c21f11 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.docker.compose.implementation.service.connection.eventhubs; + +import com.azure.messaging.eventhubs.EventData; +import com.azure.messaging.eventhubs.EventHubProducerClient; +import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsProducerClientConfiguration; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Configuration; + +import java.time.Duration; +import java.util.Collections; + +import static org.awaitility.Awaitility.waitAtMost; + +@SpringBootTest(properties = { + "spring.docker.compose.skip.in-tests=false", + "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml", + "spring.docker.compose.stop.command=down", + "spring.cloud.azure.eventhubs.namespace=eventhubsns", + "spring.cloud.azure.eventhubs.event-hub-name=eh1", + "spring.cloud.azure.eventhubs.producer.event-hub-name=eh1" +}) +@EnabledOnOs(OS.LINUX) +class EventHubsDockerComposeConnectionDetailsFactoryTests { + + @Autowired + private EventHubProducerClient producerClient; + + @Test + void producerClientCanSendMessage() { + // Wait for Event Hubs emulator to be fully ready and event hub entity to be available + waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> { + EventData event = new EventData("Hello World!"); + this.producerClient.send(Collections.singletonList(event)); + }); + } + + @Configuration(proxyBeanMethods = false) + @ImportAutoConfiguration(classes = { + AzureGlobalPropertiesAutoConfiguration.class, + AzureEventHubsAutoConfiguration.class, + AzureEventHubsProducerClientConfiguration.class}) + static class Config { + } +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json new file mode 100644 index 000000000000..9cee179974d7 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json @@ -0,0 +1,22 @@ +{ + "UserConfig": { + "NamespaceConfig": [ + { + "Type": "EventHub", + "Name": "eventhubsns", + "Entities": [ + { + "Name": "eh1", + "PartitionCount": "2", + "ConsumerGroups": [ + { "Name": "$Default" } + ] + } + ] + } + ], + "LoggingConfig": { + "Type": "File" + } + } +} diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml new file mode 100644 index 000000000000..c96760f2a76f --- /dev/null +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml @@ -0,0 +1,17 @@ +services: + eventhubs: + image: mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest + pull_policy: always + volumes: + - "./Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json" + ports: + - "5672" + environment: + ACCEPT_EULA: Y + networks: + eh-emulator: + aliases: + - "eh-emulator" + +networks: + eh-emulator: diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java new file mode 100644 index 000000000000..2f756ad934dd --- /dev/null +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.spring.cloud.testcontainers.implementation.service.connection.eventhubs; + +import com.azure.messaging.eventhubs.EventData; +import com.azure.messaging.eventhubs.EventHubProducerClient; +import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsProducerClientConfiguration; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; +import org.testcontainers.azure.EventHubsEmulatorContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.MountableFile; + +import java.time.Duration; +import java.util.Collections; + +import static org.awaitility.Awaitility.waitAtMost; + +@SpringJUnitConfig +@TestPropertySource(properties = { "spring.cloud.azure.eventhubs.event-hub-name=eh1" }) +@Testcontainers +@EnabledOnOs(OS.LINUX) +class EventHubsContainerConnectionDetailsFactoryTests { + + @Container + @ServiceConnection + private static final EventHubsEmulatorContainer EVENT_HUBS = new EventHubsEmulatorContainer( + "mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest") + .acceptLicense() + .withCopyFileToContainer(MountableFile.forClasspathResource("eventhubs/Config.json"), + "/Eventhubs_Emulator/ConfigFiles/Config.json"); + + @Autowired + private EventHubProducerClient producerClient; + + @Test + void producerClientCanSendMessage() { + // Wait for Event Hubs emulator to be fully ready and event hub entity to be available + waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> { + EventData event = new EventData("Hello World!"); + this.producerClient.send(Collections.singletonList(event)); + }); + } + + @Configuration(proxyBeanMethods = false) + @ImportAutoConfiguration(classes = {AzureGlobalPropertiesAutoConfiguration.class, + AzureEventHubsAutoConfiguration.class, + AzureEventHubsProducerClientConfiguration.class}) + static class Config { + } +} diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json b/sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json new file mode 100644 index 000000000000..9cee179974d7 --- /dev/null +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json @@ -0,0 +1,22 @@ +{ + "UserConfig": { + "NamespaceConfig": [ + { + "Type": "EventHub", + "Name": "eventhubsns", + "Entities": [ + { + "Name": "eh1", + "PartitionCount": "2", + "ConsumerGroups": [ + { "Name": "$Default" } + ] + } + ] + } + ], + "LoggingConfig": { + "Type": "File" + } + } +} From 16a93038eeeef7e54822390db345bdbb2ff83c70 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 6 Feb 2026 17:04:14 +0800 Subject: [PATCH 04/31] Fix pipeline failure --- .../eventhubs/AzureEventHubsAutoConfiguration.java | 2 ++ .../properties/ConfigurationWithoutConnectionDetailsBean.java | 2 -- .../eventhubs/AzureEventHubsAutoConfigurationTests.java | 2 +- .../EventHubsDockerComposeConnectionDetailsFactoryTests.java | 4 +--- .../EventHubsContainerConnectionDetailsFactoryTests.java | 4 +--- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java index 0e2c637a8d8a..aaec80478246 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java @@ -13,6 +13,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; @@ -22,6 +23,7 @@ * @since 4.0.0 */ @ConditionalOnClass(EventHubClientBuilder.class) +@ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.enabled", havingValue = "true", matchIfMissing = true) @Import({ AzureEventHubsPropertiesConfiguration.class, AzureEventHubsClientBuilderConfiguration.class, diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java index 9e0dbc1537c2..1f0d9e99f95f 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java @@ -7,12 +7,10 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.implementation.properties.utils.AzureGlobalPropertiesUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @ConditionalOnMissingBean(type = "com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails") -@ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = {"connection-string", "namespace"}) class ConfigurationWithoutConnectionDetailsBean { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java index 0f410bb7b6d2..e067a324315b 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java @@ -75,7 +75,7 @@ void configureWithEventHubDisabled() { void configureWithoutConnectionStringAndNamespace() { this.contextRunner .withPropertyValues("spring.cloud.azure.eventhubs.enabled=true") - .run(context -> assertThat(context).doesNotHaveBean(AzureEventHubsAutoConfiguration.class)); + .run(context -> assertThat(context).doesNotHaveBean(AzureEventHubsProperties.class)); } @Test diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index 70a8d0c21f11..c59a6d068789 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.eventhubs.EventHubProducerClient; import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsProducerClientConfiguration; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -47,8 +46,7 @@ void producerClientCanSendMessage() { @Configuration(proxyBeanMethods = false) @ImportAutoConfiguration(classes = { AzureGlobalPropertiesAutoConfiguration.class, - AzureEventHubsAutoConfiguration.class, - AzureEventHubsProducerClientConfiguration.class}) + AzureEventHubsAutoConfiguration.class}) static class Config { } } diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java index 2f756ad934dd..617d481e7ab2 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -7,7 +7,6 @@ import com.azure.messaging.eventhubs.EventHubProducerClient; import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; -import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsProducerClientConfiguration; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -55,8 +54,7 @@ void producerClientCanSendMessage() { @Configuration(proxyBeanMethods = false) @ImportAutoConfiguration(classes = {AzureGlobalPropertiesAutoConfiguration.class, - AzureEventHubsAutoConfiguration.class, - AzureEventHubsProducerClientConfiguration.class}) + AzureEventHubsAutoConfiguration.class}) static class Config { } } From 041123470a244bdcc24167bd7fc216e0bcb4968a Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 6 Feb 2026 17:08:18 +0800 Subject: [PATCH 05/31] Remove AzureServiceConfigurationBase in AzureServiceBusAutoConfiguration --- .../servicebus/AzureServiceBusAutoConfiguration.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusAutoConfiguration.java index 05ee2da18780..597cfed54acc 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusAutoConfiguration.java @@ -4,8 +4,6 @@ package com.azure.spring.cloud.autoconfigure.implementation.servicebus; import com.azure.messaging.servicebus.ServiceBusClientBuilder; -import com.azure.spring.cloud.autoconfigure.implementation.AzureServiceConfigurationBase; -import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusPropertiesConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -26,10 +24,6 @@ AzureServiceBusConsumerClientConfiguration.class, AzureServiceBusProcessorClientConfiguration.class }) -public class AzureServiceBusAutoConfiguration extends AzureServiceConfigurationBase { - - AzureServiceBusAutoConfiguration(AzureGlobalProperties azureGlobalProperties) { - super(azureGlobalProperties); - } +public class AzureServiceBusAutoConfiguration { } From 170050a701df39e6cb52741dff933b3767b0c8b9 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Fri, 6 Feb 2026 17:23:52 +0800 Subject: [PATCH 06/31] Fix version error --- sdk/spring/spring-cloud-azure-docker-compose/pom.xml | 2 +- sdk/spring/spring-cloud-azure-testcontainers/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml index 73c801c5ec93..854e43d6a6b9 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml +++ b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml @@ -86,7 +86,7 @@ com.azure azure-messaging-eventhubs - 5.20.0 + 5.21.3 true diff --git a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml index 5c198eaf7a9e..53ce4bee4534 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml +++ b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml @@ -93,7 +93,7 @@ com.azure azure-messaging-eventhubs - 5.20.0 + 5.21.3 true From 3a41b860a28547b6ea0c0049def46798a507a52c Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 10:25:53 +0800 Subject: [PATCH 07/31] Add docker compose timtout --- .../EventHubsDockerComposeConnectionDetailsFactoryTests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index c59a6d068789..a7a35fc045e0 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -24,6 +24,7 @@ "spring.docker.compose.skip.in-tests=false", "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml", "spring.docker.compose.stop.command=down", + "spring.docker.compose.readiness.timeout=PT5M", "spring.cloud.azure.eventhubs.namespace=eventhubsns", "spring.cloud.azure.eventhubs.event-hub-name=eh1", "spring.cloud.azure.eventhubs.producer.event-hub-name=eh1" From ac3b756d0dd9279536332d9385ed9ec9a8e3d322 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 10:35:06 +0800 Subject: [PATCH 08/31] Fix the mount path --- .../service/connection/eventhubs/eventhubs-compose.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml index c96760f2a76f..b2d7a7cb51fb 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml @@ -3,7 +3,8 @@ services: image: mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest pull_policy: always volumes: - - "./Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json" + # Mount the emulator configuration; container path is case-sensitive + - "./Config.json:/EventHubs_Emulator/ConfigFiles/Config.json" ports: - "5672" environment: From 3623951473b791a0749f0e61b45abdb5b11c302a Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 10:45:59 +0800 Subject: [PATCH 09/31] Update the ports and volumes --- .../service/connection/eventhubs/eventhubs-compose.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml index b2d7a7cb51fb..211e3a889c67 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml @@ -3,10 +3,11 @@ services: image: mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest pull_policy: always volumes: - # Mount the emulator configuration; container path is case-sensitive - - "./Config.json:/EventHubs_Emulator/ConfigFiles/Config.json" + # Mount the emulator configuration to the path expected by the emulator image + - "./Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json" ports: - - "5672" + # Publish AMQP port to host to make readiness probing stable + - "5672:5672" environment: ACCEPT_EULA: Y networks: From 7fc8e138dfa7587543e96009f2d65550444558f4 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 12:38:02 +0800 Subject: [PATCH 10/31] Update namespace --- ...EventHubsDockerComposeConnectionDetailsFactoryTests.java | 2 +- .../implementation/service/connection/eventhubs/Config.json | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index a7a35fc045e0..cee73f8d96c7 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -25,7 +25,7 @@ "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml", "spring.docker.compose.stop.command=down", "spring.docker.compose.readiness.timeout=PT5M", - "spring.cloud.azure.eventhubs.namespace=eventhubsns", + "spring.cloud.azure.eventhubs.namespace=emulatorns1", "spring.cloud.azure.eventhubs.event-hub-name=eh1", "spring.cloud.azure.eventhubs.producer.event-hub-name=eh1" }) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json index 9cee179974d7..0749990d11d4 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json @@ -3,14 +3,12 @@ "NamespaceConfig": [ { "Type": "EventHub", - "Name": "eventhubsns", + "Name": "emulatorns1", "Entities": [ { "Name": "eh1", "PartitionCount": "2", - "ConsumerGroups": [ - { "Name": "$Default" } - ] + "ConsumerGroups": [] } ] } From 40bf4bb23e17178571184344aa594be939d9bea2 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 13:06:05 +0800 Subject: [PATCH 11/31] Add azurite in eventhubs-compose.yaml --- .../connection/eventhubs/eventhubs-compose.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml index 211e3a889c67..5e4f23390ba2 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml @@ -9,11 +9,27 @@ services: # Publish AMQP port to host to make readiness probing stable - "5672:5672" environment: + # Event Hubs emulator requires external blob/metadata storage provided by azurite + BLOB_SERVER: azurite + METADATA_SERVER: azurite ACCEPT_EULA: Y + depends_on: + - azurite networks: eh-emulator: aliases: - "eh-emulator" + azurite: + image: "mcr.microsoft.com/azure-storage/azurite:latest" + ports: + - "10000" + - "10001" + - "10002" + networks: + eh-emulator: + aliases: + - "azurite" + networks: eh-emulator: From 8ac5324d75a39c7870c8835f1f873d4b0d63ed9a Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 13:31:36 +0800 Subject: [PATCH 12/31] Update --- .../src/test/resources/eventhubs/Config.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json b/sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json index 9cee179974d7..0749990d11d4 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/resources/eventhubs/Config.json @@ -3,14 +3,12 @@ "NamespaceConfig": [ { "Type": "EventHub", - "Name": "eventhubsns", + "Name": "emulatorns1", "Entities": [ { "Name": "eh1", "PartitionCount": "2", - "ConsumerGroups": [ - { "Name": "$Default" } - ] + "ConsumerGroups": [] } ] } From d0c2947791744fef502140190eb2e05287d6c5aa Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 13:37:16 +0800 Subject: [PATCH 13/31] Add AZURITE in EventHubsContainerConnectionDetailsFactoryTests --- ...HubsContainerConnectionDetailsFactoryTests.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java index 617d481e7ab2..26ff08acd878 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -17,6 +17,8 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.testcontainers.azure.EventHubsEmulatorContainer; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.Network; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.testcontainers.utility.MountableFile; @@ -32,13 +34,23 @@ @EnabledOnOs(OS.LINUX) class EventHubsContainerConnectionDetailsFactoryTests { + private static final Network NETWORK = Network.newNetwork(); + + @Container + private static final GenericContainer AZURITE = new GenericContainer<>("mcr.microsoft.com/azure-storage/azurite:latest") + .withExposedPorts(10000, 10001, 10002) + .withNetwork(NETWORK) + .withNetworkAliases("azurite"); + @Container @ServiceConnection private static final EventHubsEmulatorContainer EVENT_HUBS = new EventHubsEmulatorContainer( "mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest") .acceptLicense() .withCopyFileToContainer(MountableFile.forClasspathResource("eventhubs/Config.json"), - "/Eventhubs_Emulator/ConfigFiles/Config.json"); + "/Eventhubs_Emulator/ConfigFiles/Config.json") + .withNetwork(NETWORK) + .withAzuriteContainer(AZURITE); @Autowired private EventHubProducerClient producerClient; From e65c7182151c3d897d6067564295a93e88945642 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 13:41:17 +0800 Subject: [PATCH 14/31] Wait more time --- .../EventHubsDockerComposeConnectionDetailsFactoryTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index cee73f8d96c7..d2d2a9640f6e 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -38,7 +38,7 @@ class EventHubsDockerComposeConnectionDetailsFactoryTests { @Test void producerClientCanSendMessage() { // Wait for Event Hubs emulator to be fully ready and event hub entity to be available - waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> { + waitAtMost(Duration.ofSeconds(240)).pollDelay(Duration.ofSeconds(5)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> { EventData event = new EventData("Hello World!"); this.producerClient.send(Collections.singletonList(event)); }); From b54d0dd83e1e517e8e14a3aacdad0713432f04a6 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 13:46:34 +0800 Subject: [PATCH 15/31] Revert "Wait more time" This reverts commit e65c7182151c3d897d6067564295a93e88945642. --- .../EventHubsDockerComposeConnectionDetailsFactoryTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index d2d2a9640f6e..cee73f8d96c7 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -38,7 +38,7 @@ class EventHubsDockerComposeConnectionDetailsFactoryTests { @Test void producerClientCanSendMessage() { // Wait for Event Hubs emulator to be fully ready and event hub entity to be available - waitAtMost(Duration.ofSeconds(240)).pollDelay(Duration.ofSeconds(5)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> { + waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> { EventData event = new EventData("Hello World!"); this.producerClient.send(Collections.singletonList(event)); }); From 0b6b79c4d66bd645564239ca143a8c1640212eba Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 13:47:06 +0800 Subject: [PATCH 16/31] Add withEnv --- .../EventHubsContainerConnectionDetailsFactoryTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java index 26ff08acd878..1db871da4028 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -50,7 +50,8 @@ class EventHubsContainerConnectionDetailsFactoryTests { .withCopyFileToContainer(MountableFile.forClasspathResource("eventhubs/Config.json"), "/Eventhubs_Emulator/ConfigFiles/Config.json") .withNetwork(NETWORK) - .withAzuriteContainer(AZURITE); + .withEnv("BLOB_SERVER", "azurite") + .withEnv("METADATA_SERVER", "azurite"); @Autowired private EventHubProducerClient producerClient; From 5e9d947898406a039c351c2ebb6d0d86f38c729f Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 13:51:26 +0800 Subject: [PATCH 17/31] Use withAzuriteContainer --- .../EventHubsContainerConnectionDetailsFactoryTests.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java index 1db871da4028..2a8fc25560b9 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -17,7 +17,7 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.testcontainers.azure.EventHubsEmulatorContainer; -import org.testcontainers.containers.GenericContainer; +import org.testcontainers.azure.AzuriteContainer; import org.testcontainers.containers.Network; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; @@ -37,8 +37,7 @@ class EventHubsContainerConnectionDetailsFactoryTests { private static final Network NETWORK = Network.newNetwork(); @Container - private static final GenericContainer AZURITE = new GenericContainer<>("mcr.microsoft.com/azure-storage/azurite:latest") - .withExposedPorts(10000, 10001, 10002) + private static final AzuriteContainer AZURITE = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:latest") .withNetwork(NETWORK) .withNetworkAliases("azurite"); @@ -50,8 +49,7 @@ class EventHubsContainerConnectionDetailsFactoryTests { .withCopyFileToContainer(MountableFile.forClasspathResource("eventhubs/Config.json"), "/Eventhubs_Emulator/ConfigFiles/Config.json") .withNetwork(NETWORK) - .withEnv("BLOB_SERVER", "azurite") - .withEnv("METADATA_SERVER", "azurite"); + .withAzuriteContainer(AZURITE); @Autowired private EventHubProducerClient producerClient; From c7ccc4cbe61292c22b209ed3ad5768bcaa84ce09 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 14:02:05 +0800 Subject: [PATCH 18/31] Fix test failure --- .../EventHubsContainerConnectionDetailsFactoryTests.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java index 2a8fc25560b9..1ca723096499 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -29,7 +29,10 @@ import static org.awaitility.Awaitility.waitAtMost; @SpringJUnitConfig -@TestPropertySource(properties = { "spring.cloud.azure.eventhubs.event-hub-name=eh1" }) +@TestPropertySource(properties = { + "spring.cloud.azure.eventhubs.namespace=emulatorns1", + "spring.cloud.azure.eventhubs.event-hub-name=eh1" +}) @Testcontainers @EnabledOnOs(OS.LINUX) class EventHubsContainerConnectionDetailsFactoryTests { From c4347fb0e71fc26ffab4523df41f3d646c27eec1 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 14:14:06 +0800 Subject: [PATCH 19/31] Fix lint error --- .../EventHubsContainerConnectionDetailsFactory.java | 2 +- .../src/main/resources/META-INF/spring.factories | 2 +- .../EventHubsContainerConnectionDetailsFactoryTests.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/{eventhubs => hubs}/EventHubsContainerConnectionDetailsFactory.java (98%) rename sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/{eventhubs => hubs}/EventHubsContainerConnectionDetailsFactoryTests.java (99%) diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactory.java similarity index 98% rename from sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactory.java rename to sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactory.java index e76e5b9065b0..a3b5460446ef 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactory.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/main/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactory.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.testcontainers.implementation.service.connection.eventhubs; +package com.azure.spring.cloud.testcontainers.implementation.service.connection.hubs; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; import org.springframework.boot.testcontainers.service.connection.ContainerConnectionDetailsFactory; diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories b/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories index 6fe8e65243ee..a590e8a7e19f 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/main/resources/META-INF/spring.factories @@ -3,4 +3,4 @@ com.azure.spring.cloud.testcontainers.implementation.service.connection.cosmos.C com.azure.spring.cloud.testcontainers.implementation.service.connection.bus.ServiceBusContainerConnectionDetailsFactory,\ com.azure.spring.cloud.testcontainers.implementation.service.connection.storage.StorageBlobContainerConnectionDetailsFactory,\ com.azure.spring.cloud.testcontainers.implementation.service.connection.storage.StorageQueueContainerConnectionDetailsFactory,\ -com.azure.spring.cloud.testcontainers.implementation.service.connection.eventhubs.EventHubsContainerConnectionDetailsFactory +com.azure.spring.cloud.testcontainers.implementation.service.connection.hubs.EventHubsContainerConnectionDetailsFactory diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java similarity index 99% rename from sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java rename to sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java index 1ca723096499..7d36785d594e 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/eventhubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.testcontainers.implementation.service.connection.eventhubs; +package com.azure.spring.cloud.testcontainers.implementation.service.connection.hubs; import com.azure.messaging.eventhubs.EventData; import com.azure.messaging.eventhubs.EventHubProducerClient; From e3d15708487e0afcf04f195a414de07b2c633b16 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 14:29:07 +0800 Subject: [PATCH 20/31] Fix lint error --- .../EventHubsDockerComposeConnectionDetailsFactory.java | 2 +- .../src/main/resources/META-INF/spring.factories | 2 +- .../EventHubsDockerComposeConnectionDetailsFactoryTests.java | 2 +- .../service/connection/{eventhubs => hubs}/Config.json | 0 .../connection/{eventhubs => hubs}/eventhubs-compose.yaml | 0 5 files changed, 3 insertions(+), 3 deletions(-) rename sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/{eventhubs => hubs}/EventHubsDockerComposeConnectionDetailsFactory.java (98%) rename sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/{eventhubs => hubs}/EventHubsDockerComposeConnectionDetailsFactoryTests.java (98%) rename sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/{eventhubs => hubs}/Config.json (100%) rename sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/{eventhubs => hubs}/eventhubs-compose.yaml (100%) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactory.java b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactory.java similarity index 98% rename from sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactory.java rename to sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactory.java index cfe5efbb30c6..e34128b855f5 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactory.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/main/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactory.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.docker.compose.implementation.service.connection.eventhubs; +package com.azure.spring.cloud.docker.compose.implementation.service.connection.hubs; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; import org.springframework.boot.docker.compose.core.RunningService; diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories b/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories index 34751950da36..591a4d528944 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/main/resources/META-INF/spring.factories @@ -2,4 +2,4 @@ org.springframework.boot.autoconfigure.service.connection.ConnectionDetailsFacto com.azure.spring.cloud.docker.compose.implementation.service.connection.bus.ServiceBusDockerComposeConnectionDetailsFactory,\ com.azure.spring.cloud.docker.compose.implementation.service.connection.storage.StorageBlobDockerComposeConnectionDetailsFactory,\ com.azure.spring.cloud.docker.compose.implementation.service.connection.storage.StorageQueueDockerComposeConnectionDetailsFactory,\ -com.azure.spring.cloud.docker.compose.implementation.service.connection.eventhubs.EventHubsDockerComposeConnectionDetailsFactory +com.azure.spring.cloud.docker.compose.implementation.service.connection.hubs.EventHubsDockerComposeConnectionDetailsFactory diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java similarity index 98% rename from sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java rename to sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index cee73f8d96c7..44942571e7e3 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.spring.cloud.docker.compose.implementation.service.connection.eventhubs; +package com.azure.spring.cloud.docker.compose.implementation.service.connection.hubs; import com.azure.messaging.eventhubs.EventData; import com.azure.messaging.eventhubs.EventHubProducerClient; diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/Config.json similarity index 100% rename from sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/Config.json rename to sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/Config.json diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml similarity index 100% rename from sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml rename to sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml From ae9ab9a3b3938de01b63a39acc3d13a2cbff4359 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 14:39:29 +0800 Subject: [PATCH 21/31] Resolve PR comment, fix test failure --- .../properties/ConfigurationWithoutConnectionDetailsBean.java | 2 ++ .../EventHubsDockerComposeConnectionDetailsFactoryTests.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java index 1f0d9e99f95f..9e0dbc1537c2 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/properties/ConfigurationWithoutConnectionDetailsBean.java @@ -7,10 +7,12 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.implementation.properties.utils.AzureGlobalPropertiesUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @ConditionalOnMissingBean(type = "com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails") +@ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = {"connection-string", "namespace"}) class ConfigurationWithoutConnectionDetailsBean { diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index 44942571e7e3..aacb6952a47d 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -22,7 +22,7 @@ @SpringBootTest(properties = { "spring.docker.compose.skip.in-tests=false", - "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/eventhubs/eventhubs-compose.yaml", + "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml", "spring.docker.compose.stop.command=down", "spring.docker.compose.readiness.timeout=PT5M", "spring.cloud.azure.eventhubs.namespace=emulatorns1", From 79ddbf65b035358cdbe9adaa62e3ae41502da901 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 14:55:01 +0800 Subject: [PATCH 22/31] Resolve PR comment --- .../ServiceBusDockerComposeConnectionDetailsFactoryTests.java | 2 +- .../service/connection/{servicebus => bus}/Config.json | 0 .../connection/{servicebus => bus}/servicebus-compose.yaml | 0 .../service/connection/hubs/eventhubs-compose.yaml | 3 +-- 4 files changed, 2 insertions(+), 3 deletions(-) rename sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/{servicebus => bus}/Config.json (100%) rename sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/{servicebus => bus}/servicebus-compose.yaml (100%) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java index 9a14f229e914..4955ed93e574 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java @@ -30,7 +30,7 @@ @SpringBootTest(properties = { "spring.docker.compose.skip.in-tests=false", - "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/servicebus/servicebus-compose.yaml", + "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/servicebus-compose.yaml", "spring.docker.compose.stop.command=down", "spring.cloud.azure.servicebus.namespace=sbemulatorns", "spring.cloud.azure.servicebus.entity-name=queue.1", diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/servicebus/Config.json b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/Config.json similarity index 100% rename from sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/servicebus/Config.json rename to sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/Config.json diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/servicebus/servicebus-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/servicebus-compose.yaml similarity index 100% rename from sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/servicebus/servicebus-compose.yaml rename to sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/servicebus-compose.yaml diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml index 5e4f23390ba2..6aa1d2d7a0f9 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/resources/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml @@ -6,8 +6,7 @@ services: # Mount the emulator configuration to the path expected by the emulator image - "./Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json" ports: - # Publish AMQP port to host to make readiness probing stable - - "5672:5672" + - "5672" environment: # Event Hubs emulator requires external blob/metadata storage provided by azurite BLOB_SERVER: azurite From af6d5a34bc1e23f7ca375b93359db1a4569ddca6 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 16:10:55 +0800 Subject: [PATCH 23/31] Resolve comment, fix test failures. --- .../AzureEventHubsAutoConfiguration.java | 16 ----------- ...reEventHubsClientBuilderConfiguration.java | 27 ++++++++++++++++--- ...eEventHubsConsumerClientConfiguration.java | 1 - ...reEventHubsMessagingAutoConfiguration.java | 2 -- ...EventHubsProcessorClientConfiguration.java | 9 +------ ...eEventHubsProducerClientConfiguration.java | 1 - ...ntHubsClientBuilderConfigurationTests.java | 13 ++++----- ...ntHubsMessagingAutoConfigurationTests.java | 1 - 8 files changed, 31 insertions(+), 39 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java index aaec80478246..20bef7bf3721 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfiguration.java @@ -4,17 +4,10 @@ package com.azure.spring.cloud.autoconfigure.implementation.eventhubs; import com.azure.messaging.eventhubs.EventHubClientBuilder; -import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsProperties; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsPropertiesConfiguration; -import com.azure.spring.cloud.core.provider.connectionstring.ServiceConnectionStringProvider; -import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider; -import com.azure.spring.cloud.core.service.AzureServiceType; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; /** @@ -34,13 +27,4 @@ }) public class AzureEventHubsAutoConfiguration { - @Bean - @ConditionalOnExpression("'${spring.cloud.azure.eventhubs.connection-string:}' != ''") - @ConditionalOnMissingBean(value = AzureServiceType.EventHubs.class, parameterizedContainer = ServiceConnectionStringProvider.class) - StaticConnectionStringProvider eventHubsStaticConnectionStringProvider( - AzureEventHubsProperties eventHubsProperties) { - return new StaticConnectionStringProvider<>(AzureServiceType.EVENT_HUBS, - eventHubsProperties.getConnectionString()); - } - } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java index 9f4471b9fe0c..69f9f090f085 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java @@ -4,18 +4,22 @@ package com.azure.spring.cloud.autoconfigure.implementation.eventhubs; import com.azure.messaging.eventhubs.EventHubClientBuilder; -import com.azure.spring.cloud.autoconfigure.implementation.condition.ConditionalOnAnyProperty; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsProperties; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsPropertiesConfiguration; import com.azure.spring.cloud.core.customizer.AzureServiceClientBuilderCustomizer; import com.azure.spring.cloud.core.implementation.util.AzureSpringIdentifier; import com.azure.spring.cloud.core.provider.connectionstring.ServiceConnectionStringProvider; +import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider; import com.azure.spring.cloud.core.service.AzureServiceType; import com.azure.spring.cloud.service.implementation.eventhubs.factory.EventHubClientBuilderFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import static com.azure.spring.cloud.autoconfigure.implementation.context.AzureContextUtils.EVENT_HUB_CLIENT_BUILDER_FACTORY_BEAN_NAME; @@ -24,9 +28,16 @@ * */ @Configuration(proxyBeanMethods = false) -@ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = { "connection-string", "namespace" }) +@Import(AzureEventHubsPropertiesConfiguration.class) +@ConditionalOnBean(AzureEventHubsProperties.class) class AzureEventHubsClientBuilderConfiguration { + private final AzureEventHubsProperties eventHubsProperties; + + AzureEventHubsClientBuilderConfiguration(AzureEventHubsProperties eventHubsProperties) { + this.eventHubsProperties = eventHubsProperties; + } + @Bean @ConditionalOnMissingBean EventHubClientBuilder eventHubClientBuilder(@Qualifier(EVENT_HUB_CLIENT_BUILDER_FACTORY_BEAN_NAME) @@ -36,10 +47,10 @@ EventHubClientBuilder eventHubClientBuilder(@Qualifier(EVENT_HUB_CLIENT_BUILDER_ @Bean(EVENT_HUB_CLIENT_BUILDER_FACTORY_BEAN_NAME) @ConditionalOnMissingBean - EventHubClientBuilderFactory eventHubClientBuilderFactory(AzureEventHubsProperties properties, + EventHubClientBuilderFactory eventHubClientBuilderFactory( ObjectProvider> connectionStringProviders, ObjectProvider> customizers) { - final EventHubClientBuilderFactory factory = new EventHubClientBuilderFactory(properties); + final EventHubClientBuilderFactory factory = new EventHubClientBuilderFactory(this.eventHubsProperties); factory.setSpringIdentifier(AzureSpringIdentifier.AZURE_SPRING_EVENT_HUBS); connectionStringProviders.orderedStream().findFirst().ifPresent(factory::setConnectionStringProvider); @@ -47,4 +58,12 @@ EventHubClientBuilderFactory eventHubClientBuilderFactory(AzureEventHubsProperti return factory; } + @Bean + @ConditionalOnExpression("'${spring.cloud.azure.eventhubs.connection-string:}' != ''") + @ConditionalOnMissingBean(value = AzureServiceType.EventHubs.class, parameterizedContainer = ServiceConnectionStringProvider.class) + StaticConnectionStringProvider eventHubsStaticConnectionStringProvider() { + return new StaticConnectionStringProvider<>(AzureServiceType.EVENT_HUBS, + this.eventHubsProperties.getConnectionString()); + } + } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java index a7fd2cbd2b76..764b784868b1 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java @@ -42,7 +42,6 @@ class AzureEventHubsConsumerClientConfiguration { @ConditionalOnMissingProperty(prefix = "spring.cloud.azure.eventhubs.consumer", name = { "connection-string", "namespace" }) - @ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = { "connection-string", "namespace" }) @ConditionalOnBean(EventHubClientBuilder.class) @Configuration(proxyBeanMethods = false) static class SharedConsumerConnectionConfiguration { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfiguration.java index 24e33d671c62..abd965fbb8d0 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfiguration.java @@ -6,7 +6,6 @@ import com.azure.core.credential.TokenCredential; import com.azure.messaging.eventhubs.CheckpointStore; import com.azure.messaging.eventhubs.EventData; -import com.azure.spring.cloud.autoconfigure.implementation.condition.ConditionalOnAnyProperty; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsProperties; import com.azure.spring.cloud.core.implementation.credential.resolver.AzureTokenCredentialResolver; import com.azure.spring.cloud.core.provider.connectionstring.ServiceConnectionStringProvider; @@ -53,7 +52,6 @@ @ConditionalOnClass(EventHubsTemplate.class) @AutoConfigureAfter(AzureEventHubsAutoConfiguration.class) @ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.enabled", havingValue = "true", matchIfMissing = true) -@ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = {"connection-string", "namespace"}) @ConditionalOnBean(AzureEventHubsProperties.class) @Import({ AzureEventHubsMessagingAutoConfiguration.EventHubsTemplateConfiguration.class, diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProcessorClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProcessorClientConfiguration.java index 75464f665054..3ec7c9426572 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProcessorClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProcessorClientConfiguration.java @@ -33,7 +33,7 @@ */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(EventProcessorClientBuilder.class) -@ConditionalOnBean({ MessageListener.class, CheckpointStore.class, EventHubsErrorHandler.class }) +@ConditionalOnBean({ MessageListener.class, CheckpointStore.class, EventHubsErrorHandler.class, AzureEventHubsProperties.class }) @Conditional(AzureEventHubsProcessorClientConfiguration.ProcessorAvailableCondition.class) class AzureEventHubsProcessorClientConfiguration { @@ -119,12 +119,5 @@ static class ConsumerGroup { ConsumerGroup() { } } - - @ConditionalOnAnyProperty( - prefix = "spring.cloud.azure.eventhubs", - name = { "namespace", "connection-string", "processor.namespace", "processor.connection-string" }) - static class ConnectionInfo { - - } } } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java index 25a6bca7d4c8..f33aa91e0509 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java @@ -34,7 +34,6 @@ class AzureEventHubsProducerClientConfiguration { @ConditionalOnMissingProperty(prefix = "spring.cloud.azure.eventhubs.producer", name = { "connection-string", "namespace" }) - @ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = { "connection-string", "namespace" }) @ConditionalOnBean(EventHubClientBuilder.class) @Configuration(proxyBeanMethods = false) static class SharedProducerConnectionConfiguration { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java index d4b92480a714..5f6a25b49b9d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java @@ -6,6 +6,7 @@ import com.azure.data.appconfiguration.ConfigurationClientBuilder; import com.azure.messaging.eventhubs.EventHubClientBuilder; import com.azure.spring.cloud.autoconfigure.implementation.TestBuilderCustomizer; +import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; import com.azure.spring.cloud.service.implementation.eventhubs.factory.EventHubClientBuilderFactory; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -17,7 +18,7 @@ class AzureEventHubsClientBuilderConfigurationTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(AzureEventHubsClientBuilderConfiguration.class)); + .withConfiguration(AutoConfigurations.of(AzureEventHubsAutoConfiguration.class)); @Test void noConnectionInfoProvidedShouldNotConfigure() { @@ -30,7 +31,7 @@ void connectionStringProvidedShouldConfigure() { .withPropertyValues( "spring.cloud.azure.eventhubs.connection-string=" + String.format(CONNECTION_STRING_FORMAT, "test-namespace") ) - .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) .run(context -> { assertThat(context).hasSingleBean(AzureEventHubsClientBuilderConfiguration.class); assertThat(context).hasSingleBean(EventHubClientBuilderFactory.class); @@ -44,7 +45,7 @@ void namespaceProvidedShouldConfigure() { .withPropertyValues( "spring.cloud.azure.eventhubs.namespace=test-namespace" ) - .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) .run(context -> { assertThat(context).hasSingleBean(AzureEventHubsClientBuilderConfiguration.class); assertThat(context).hasSingleBean(EventHubClientBuilderFactory.class); @@ -59,7 +60,7 @@ void customizerShouldBeCalled() { .withPropertyValues( "spring.cloud.azure.eventhubs.connection-string=" + String.format(CONNECTION_STRING_FORMAT, "test-namespace") ) - .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) .withBean("customizer1", EventHubBuilderCustomizer.class, () -> customizer) .withBean("customizer2", EventHubBuilderCustomizer.class, () -> customizer) .run(context -> assertThat(customizer.getCustomizedTimes()).isEqualTo(2)); @@ -73,7 +74,7 @@ void otherCustomizerShouldNotBeCalled() { .withPropertyValues( "spring.cloud.azure.eventhubs.connection-string=" + String.format(CONNECTION_STRING_FORMAT, "test-namespace") ) - .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) .withBean("customizer1", EventHubBuilderCustomizer.class, () -> customizer) .withBean("customizer2", EventHubBuilderCustomizer.class, () -> customizer) .withBean("customizer3", OtherBuilderCustomizer.class, () -> otherBuilderCustomizer) @@ -89,7 +90,7 @@ void userDefinedEventHubsClientBuilderProvidedShouldNotAutoconfigure() { .withPropertyValues( "spring.cloud.azure.eventhubs.connection-string=" + String.format(CONNECTION_STRING_FORMAT, "test-namespace") ) - .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) .withBean("user-defined-builder", EventHubClientBuilder.class, EventHubClientBuilder::new) .run(context -> { assertThat(context).hasSingleBean(EventHubClientBuilder.class); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfigurationTests.java index 8ae0399acb60..6a5520c546d5 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsMessagingAutoConfigurationTests.java @@ -59,7 +59,6 @@ void withoutEventHubsTemplateShouldNotConfigure() { @Test void withoutEventHubConnectionShouldNotConfigure() { this.contextRunner - .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) .withBean(CheckpointStore.class, TestCheckpointStore::new) .run(context -> assertThat(context).doesNotHaveBean(AzureEventHubsMessagingAutoConfiguration.ProcessorContainerConfiguration.class)); } From f1ecc0ad8fd7f5f12cf35875f41178e6a730770f Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 16:21:20 +0800 Subject: [PATCH 24/31] Resolve PR comments --- .../EventHubsDockerComposeConnectionDetailsFactoryTests.java | 1 - .../hubs/EventHubsContainerConnectionDetailsFactoryTests.java | 1 - 2 files changed, 2 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index aacb6952a47d..e9e665c1a0be 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -25,7 +25,6 @@ "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/eventhubs-compose.yaml", "spring.docker.compose.stop.command=down", "spring.docker.compose.readiness.timeout=PT5M", - "spring.cloud.azure.eventhubs.namespace=emulatorns1", "spring.cloud.azure.eventhubs.event-hub-name=eh1", "spring.cloud.azure.eventhubs.producer.event-hub-name=eh1" }) diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java index 7d36785d594e..4e9c3756445b 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -30,7 +30,6 @@ @SpringJUnitConfig @TestPropertySource(properties = { - "spring.cloud.azure.eventhubs.namespace=emulatorns1", "spring.cloud.azure.eventhubs.event-hub-name=eh1" }) @Testcontainers From 2c95cc2b25d9d7e5999d2e83b67dfc37669d8b91 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 16:45:09 +0800 Subject: [PATCH 25/31] Add @ConditionalOnBean(AzureEventHubsProperties.class) guard to BlobCheckpointStore, Producer, and Consumer configs Prevent startup failures when EventHubs auto-config activates without base-level connection info. Without these guards, configurations that constructor-inject AzureEventHubsProperties could fail with UnsatisfiedDependencyException when only sub-level properties are set. - AzureBlobCheckpointStoreConfiguration: guard against missing properties bean - AzureEventHubsProducerClientConfiguration: guard dedicated producer config - AzureEventHubsConsumerClientConfiguration: guard dedicated consumer config - Updated tests to provide AzureEventHubsPropertiesTestConfiguration --- .../eventhubs/AzureBlobCheckpointStoreConfiguration.java | 2 ++ .../eventhubs/AzureEventHubsConsumerClientConfiguration.java | 1 + .../eventhubs/AzureEventHubsProducerClientConfiguration.java | 1 + .../AzureEventHubsConsumerClientConfigurationTests.java | 2 ++ .../AzureEventHubsProducerClientConfigurationTests.java | 3 +++ 5 files changed, 9 insertions(+) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureBlobCheckpointStoreConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureBlobCheckpointStoreConfiguration.java index 16fd2746bb4d..48ce309d0e8d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureBlobCheckpointStoreConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureBlobCheckpointStoreConfiguration.java @@ -16,6 +16,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -32,6 +33,7 @@ */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ BlobCheckpointStore.class, EventHubClientBuilder.class}) +@ConditionalOnBean(AzureEventHubsProperties.class) @ConditionalOnProperty(prefix = "spring.cloud.azure.eventhubs.processor.checkpoint-store", name = { "container-name", "account-name" }) class AzureBlobCheckpointStoreConfiguration { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java index 764b784868b1..0307e335558f 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfiguration.java @@ -38,6 +38,7 @@ AzureEventHubsConsumerClientConfiguration.SharedConsumerConnectionConfiguration.class }) @ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = { "event-hub-name", "consumer.event-hub-name" }) +@ConditionalOnBean(AzureEventHubsProperties.class) @ConditionalOnProperty(prefix = "spring.cloud.azure.eventhubs.consumer", name = "consumer-group") class AzureEventHubsConsumerClientConfiguration { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java index f33aa91e0509..5e5cae605531 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfiguration.java @@ -30,6 +30,7 @@ * */ @Configuration(proxyBeanMethods = false) +@ConditionalOnBean(AzureEventHubsProperties.class) @ConditionalOnAnyProperty(prefix = "spring.cloud.azure.eventhubs", name = { "event-hub-name", "producer.event-hub-name" }) class AzureEventHubsProducerClientConfiguration { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfigurationTests.java index 751b0488f619..c63f74d148ef 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsConsumerClientConfigurationTests.java @@ -34,6 +34,7 @@ void eventHubNameAndConsumerGroupProvidedShouldConfigure() { "spring.cloud.azure.eventhubs.event-hub-name=test-eventhub", "spring.cloud.azure.eventhubs.consumer.consumer-group=test-consumer-group" ) + .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) .run(context -> { assertThat(context).hasSingleBean(AzureEventHubsConsumerClientConfiguration.class); assertThat(context).doesNotHaveBean(AzureEventHubsConsumerClientConfiguration.SharedConsumerConnectionConfiguration.class); @@ -45,6 +46,7 @@ void eventHubNameAndConsumerGroupProvidedShouldConfigure() { "spring.cloud.azure.eventhubs.consumer.event-hub-name=test-eventhub", "spring.cloud.azure.eventhubs.consumer.consumer-group=test-consumer-group" ) + .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) .run(context -> { assertThat(context).hasSingleBean(AzureEventHubsConsumerClientConfiguration.class); assertThat(context).doesNotHaveBean(AzureEventHubsConsumerClientConfiguration.SharedConsumerConnectionConfiguration.class); diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfigurationTests.java index d8c4f6147c89..db7361326694 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsProducerClientConfigurationTests.java @@ -33,6 +33,7 @@ void eventHubNameProvidedShouldConfigure() { .withPropertyValues( "spring.cloud.azure.eventhubs.event-hub-name=test-eventhub" ) + .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) .run(context -> { assertThat(context).hasSingleBean(AzureEventHubsProducerClientConfiguration.class); assertThat(context).doesNotHaveBean(AzureEventHubsProducerClientConfiguration.SharedProducerConnectionConfiguration.class); @@ -43,6 +44,7 @@ void eventHubNameProvidedShouldConfigure() { .withPropertyValues( "spring.cloud.azure.eventhubs.producer.event-hub-name=test-eventhub" ) + .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) .run(context -> { assertThat(context).hasSingleBean(AzureEventHubsProducerClientConfiguration.class); assertThat(context).doesNotHaveBean(AzureEventHubsProducerClientConfiguration.SharedProducerConnectionConfiguration.class); @@ -65,6 +67,7 @@ void withGlobalEventHubConnectionSetShouldConfigureShared() { "spring.cloud.azure.eventhubs.namespace=" + namespace, "spring.cloud.azure.eventhubs.event-hub-name=" + eventHubName ) + .withUserConfiguration(AzureEventHubsPropertiesTestConfiguration.class) .withBean(EventHubClientBuilder.class, () -> clientBuilder) .run( context -> { From e54fff25e0cb89613f7268990e30e525eed57bed Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Mon, 9 Feb 2026 17:10:50 +0800 Subject: [PATCH 26/31] Change scope to test to avoid change in api view --- .../spring-cloud-azure-docker-compose/pom.xml | 24 ++++++------- .../spring-cloud-azure-testcontainers/pom.xml | 36 +++++++++---------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml index 854e43d6a6b9..0774f9f363f5 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/pom.xml +++ b/sdk/spring/spring-cloud-azure-docker-compose/pom.xml @@ -77,18 +77,6 @@ 12.28.1 true - - com.azure - azure-messaging-servicebus - 7.17.17 - true - - - com.azure - azure-messaging-eventhubs - 5.21.3 - true - org.springframework.boot @@ -110,6 +98,18 @@ provided + + com.azure + azure-messaging-servicebus + 7.17.17 + test + + + com.azure + azure-messaging-eventhubs + 5.21.3 + test + com.azure.spring spring-messaging-azure-servicebus diff --git a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml index 53ce4bee4534..84a0148236b9 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/pom.xml +++ b/sdk/spring/spring-cloud-azure-testcontainers/pom.xml @@ -78,24 +78,12 @@ 12.28.1 true - - com.azure - azure-messaging-servicebus - 7.17.17 - true - com.azure.spring spring-messaging-azure-servicebus 7.1.0-beta.1 test - - com.azure - azure-messaging-eventhubs - 5.21.3 - true - org.springframework.boot @@ -108,12 +96,6 @@ 1.21.3 true - - com.microsoft.sqlserver - mssql-jdbc - 13.2.1.jre11 - true - @@ -124,6 +106,24 @@ provided + + com.azure + azure-messaging-servicebus + 7.17.17 + test + + + com.azure + azure-messaging-eventhubs + 5.21.3 + test + + + com.microsoft.sqlserver + mssql-jdbc + 13.2.1.jre11 + test + org.springframework spring-test From db3dfd8a9eee3a48a2d070ca45e9fca7c43bd143 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Tue, 10 Feb 2026 10:05:49 +0800 Subject: [PATCH 27/31] Add test about connectionDetails bean --- ...sDockerComposeConnectionDetailsFactoryTests.java | 13 +++++++++++++ ...sDockerComposeConnectionDetailsFactoryTests.java | 13 +++++++++++++ ...ceBusContainerConnectionDetailsFactoryTests.java | 12 ++++++++++++ ...tHubsContainerConnectionDetailsFactoryTests.java | 13 +++++++++++++ 4 files changed, 51 insertions(+) diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java index 4955ed93e574..3f1d51308a7d 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/ServiceBusDockerComposeConnectionDetailsFactoryTests.java @@ -8,6 +8,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.AzureServiceBusAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.AzureServiceBusMessagingAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusConnectionDetails; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusErrorHandler; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusRecordMessageListener; import com.azure.spring.messaging.servicebus.core.ServiceBusTemplate; @@ -32,6 +33,7 @@ "spring.docker.compose.skip.in-tests=false", "spring.docker.compose.file=classpath:com/azure/spring/cloud/docker/compose/implementation/service/connection/bus/servicebus-compose.yaml", "spring.docker.compose.stop.command=down", + "spring.docker.compose.readiness.timeout=PT5M", "spring.cloud.azure.servicebus.namespace=sbemulatorns", "spring.cloud.azure.servicebus.entity-name=queue.1", "spring.cloud.azure.servicebus.entity-type=queue", @@ -43,12 +45,23 @@ @EnabledOnOs(OS.LINUX) class ServiceBusDockerComposeConnectionDetailsFactoryTests { + @Autowired + private AzureServiceBusConnectionDetails connectionDetails; + @Autowired private ServiceBusSenderClient senderClient; @Autowired private ServiceBusTemplate serviceBusTemplate; + @Test + void connectionDetailsShouldBeProvidedByFactory() { + assertThat(connectionDetails).isNotNull(); + assertThat(connectionDetails.getConnectionString()) + .isNotBlank() + .startsWith("Endpoint=sb://"); + } + @Test void senderClientCanSendMessage() { // Wait for Service Bus emulator to be fully ready and queue entity to be available diff --git a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java index e9e665c1a0be..1369301024c1 100644 --- a/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-docker-compose/src/test/java/com/azure/spring/cloud/docker/compose/implementation/service/connection/hubs/EventHubsDockerComposeConnectionDetailsFactoryTests.java @@ -7,6 +7,7 @@ import com.azure.messaging.eventhubs.EventHubProducerClient; import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -18,6 +19,7 @@ import java.time.Duration; import java.util.Collections; +import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.waitAtMost; @SpringBootTest(properties = { @@ -31,9 +33,20 @@ @EnabledOnOs(OS.LINUX) class EventHubsDockerComposeConnectionDetailsFactoryTests { + @Autowired + private AzureEventHubsConnectionDetails connectionDetails; + @Autowired private EventHubProducerClient producerClient; + @Test + void connectionDetailsShouldBeProvidedByFactory() { + assertThat(connectionDetails).isNotNull(); + assertThat(connectionDetails.getConnectionString()) + .isNotBlank() + .startsWith("Endpoint=sb://"); + } + @Test void producerClientCanSendMessage() { // Wait for Event Hubs emulator to be fully ready and event hub entity to be available diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java index 0771ab5da8a4..de67d4779f35 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/bus/ServiceBusContainerConnectionDetailsFactoryTests.java @@ -8,6 +8,7 @@ import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.AzureServiceBusAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.AzureServiceBusMessagingAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusConnectionDetails; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusErrorHandler; import com.azure.spring.cloud.service.servicebus.consumer.ServiceBusRecordMessageListener; import com.azure.spring.messaging.servicebus.core.ServiceBusTemplate; @@ -61,12 +62,23 @@ class ServiceBusContainerConnectionDetailsFactoryTests { .withNetwork(NETWORK) .withMsSqlServerContainer(SQLSERVER); + @Autowired + private AzureServiceBusConnectionDetails connectionDetails; + @Autowired private ServiceBusSenderClient senderClient; @Autowired private ServiceBusTemplate serviceBusTemplate; + @Test + void connectionDetailsShouldBeProvidedByFactory() { + assertThat(connectionDetails).isNotNull(); + assertThat(connectionDetails.getConnectionString()) + .isNotBlank() + .startsWith("Endpoint=sb://"); + } + @Test void senderClientCanSendMessage() { // Wait for Service Bus emulator to be fully ready and queue entity to be available diff --git a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java index 4e9c3756445b..84c05c2bc6a2 100644 --- a/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java +++ b/sdk/spring/spring-cloud-azure-testcontainers/src/test/java/com/azure/spring/cloud/testcontainers/implementation/service/connection/hubs/EventHubsContainerConnectionDetailsFactoryTests.java @@ -7,6 +7,7 @@ import com.azure.messaging.eventhubs.EventHubProducerClient; import com.azure.spring.cloud.autoconfigure.implementation.context.AzureGlobalPropertiesAutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -26,6 +27,7 @@ import java.time.Duration; import java.util.Collections; +import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.waitAtMost; @SpringJUnitConfig @@ -53,9 +55,20 @@ class EventHubsContainerConnectionDetailsFactoryTests { .withNetwork(NETWORK) .withAzuriteContainer(AZURITE); + @Autowired + private AzureEventHubsConnectionDetails connectionDetails; + @Autowired private EventHubProducerClient producerClient; + @Test + void connectionDetailsShouldBeProvidedByFactory() { + assertThat(connectionDetails).isNotNull(); + assertThat(connectionDetails.getConnectionString()) + .isNotBlank() + .startsWith("Endpoint=sb://"); + } + @Test void producerClientCanSendMessage() { // Wait for Event Hubs emulator to be fully ready and event hub entity to be available From a9b567ca993ca61db2c6d77e2a36459b9da4f535 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Tue, 10 Feb 2026 10:22:14 +0800 Subject: [PATCH 28/31] Update test name --- .../eventhubs/AzureEventHubsAutoConfigurationTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java index e067a324315b..3a81ac24420a 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsAutoConfigurationTests.java @@ -281,7 +281,7 @@ void configurationPropertiesShouldBind() { } @Test - void configureWithConnectionDetails() { + void connectionDetailsOverridesPropertyConnectionString() { String connectionString = String.format(CONNECTION_STRING_FORMAT, "test-namespace"); this.contextRunner .withPropertyValues( From 768f81b89fc1707039211d4ba2d1073e6a281f76 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Tue, 10 Feb 2026 14:16:52 +0800 Subject: [PATCH 29/31] Make AzureCosmosAutoConfiguration consistant with eventhubs and servicebus --- .../cosmos/AzureCosmosAutoConfiguration.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/cosmos/AzureCosmosAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/cosmos/AzureCosmosAutoConfiguration.java index c5b09a30c5f7..2b725965744d 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/cosmos/AzureCosmosAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/cosmos/AzureCosmosAutoConfiguration.java @@ -4,8 +4,6 @@ package com.azure.spring.cloud.autoconfigure.implementation.cosmos; import com.azure.cosmos.CosmosClientBuilder; -import com.azure.spring.cloud.autoconfigure.implementation.AzureServiceConfigurationBase; -import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; import com.azure.spring.cloud.autoconfigure.implementation.cosmos.properties.AzureCosmosPropertiesConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -21,9 +19,5 @@ CosmosClientConfiguration.class }) @ConditionalOnClass(CosmosClientBuilder.class) -public class AzureCosmosAutoConfiguration extends AzureServiceConfigurationBase { - - protected AzureCosmosAutoConfiguration(AzureGlobalProperties azureProperties) { - super(azureProperties); - } +public class AzureCosmosAutoConfiguration { } From 508a7481c056d0c5c38e92a2efcc089ead8ef2f7 Mon Sep 17 00:00:00 2001 From: Rujun Chen Date: Tue, 10 Feb 2026 17:11:25 +0800 Subject: [PATCH 30/31] Configure StaticConnectionStringProvider when using ConnectionDetails --- ...reEventHubsClientBuilderConfiguration.java | 14 ++++- .../AzureEventHubsKafkaAutoConfiguration.java | 18 ++++++ ...eServiceBusClientBuilderConfiguration.java | 11 ++++ ...ntHubsClientBuilderConfigurationTests.java | 53 ++++++++++++++++ ...eEventHubsKafkaAutoConfigurationTests.java | 62 +++++++++++++++++++ ...iceBusClientBuilderConfigurationTests.java | 30 ++++++++- 6 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/kafka/AzureEventHubsKafkaAutoConfigurationTests.java diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java index 69f9f090f085..e895d3ee2f96 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java @@ -4,6 +4,7 @@ package com.azure.spring.cloud.autoconfigure.implementation.eventhubs; import com.azure.messaging.eventhubs.EventHubClientBuilder; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsProperties; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsPropertiesConfiguration; import com.azure.spring.cloud.core.customizer.AzureServiceClientBuilderCustomizer; @@ -15,8 +16,8 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -59,11 +60,20 @@ EventHubClientBuilderFactory eventHubClientBuilderFactory( } @Bean - @ConditionalOnExpression("'${spring.cloud.azure.eventhubs.connection-string:}' != ''") + @ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.connection-string") @ConditionalOnMissingBean(value = AzureServiceType.EventHubs.class, parameterizedContainer = ServiceConnectionStringProvider.class) StaticConnectionStringProvider eventHubsStaticConnectionStringProvider() { return new StaticConnectionStringProvider<>(AzureServiceType.EVENT_HUBS, this.eventHubsProperties.getConnectionString()); } + @Bean + @ConditionalOnBean(AzureEventHubsConnectionDetails.class) + @ConditionalOnMissingBean(value = AzureServiceType.EventHubs.class, parameterizedContainer = ServiceConnectionStringProvider.class) + StaticConnectionStringProvider eventHubsConnectionDetailsStaticConnectionStringProvider( + AzureEventHubsConnectionDetails connectionDetails) { + return new StaticConnectionStringProvider<>(AzureServiceType.EVENT_HUBS, + connectionDetails.getConnectionString()); + } + } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/kafka/AzureEventHubsKafkaAutoConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/kafka/AzureEventHubsKafkaAutoConfiguration.java index ed73cf8d4337..d018ef936afa 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/kafka/AzureEventHubsKafkaAutoConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/kafka/AzureEventHubsKafkaAutoConfiguration.java @@ -4,6 +4,7 @@ package com.azure.spring.cloud.autoconfigure.implementation.eventhubs.kafka; import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.AzureEventHubsAutoConfiguration; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; import com.azure.spring.cloud.autoconfigure.implementation.kafka.AzureEventHubsKafkaOAuth2AutoConfiguration; import com.azure.spring.cloud.autoconfigure.implementation.resourcemanager.AzureEventHubsResourceManagerAutoConfiguration; import com.azure.spring.cloud.core.implementation.connectionstring.EventHubsConnectionString; @@ -56,6 +57,23 @@ StaticConnectionStringProvider eventHubsKafkaConnect return new StaticConnectionStringProvider<>(AzureServiceType.EVENT_HUBS, connectionString); } + @Bean + @ConditionalOnBean(AzureEventHubsConnectionDetails.class) + @ConditionalOnMissingBean(value = AzureServiceType.EventHubs.class, parameterizedContainer = ServiceConnectionStringProvider.class) + StaticConnectionStringProvider eventHubsKafkaConnectionDetailsConnectionString( + AzureEventHubsConnectionDetails connectionDetails) { + + String connectionString = connectionDetails.getConnectionString(); + try { + new EventHubsConnectionString(connectionString); + } catch (Exception e) { + LOGGER.error("A valid Event Hubs connection string must be provided"); + throw e; + } + + return new StaticConnectionStringProvider<>(AzureServiceType.EVENT_HUBS, connectionString); + } + @Bean @ConditionalOnBean(value = AzureServiceType.EventHubs.class, parameterizedContainer = ServiceConnectionStringProvider.class) static KafkaPropertiesBeanPostProcessor kafkaPropertiesBeanPostProcessor() { diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfiguration.java index 9002f082e0c6..166d6a6593d4 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfiguration.java @@ -4,6 +4,7 @@ package com.azure.spring.cloud.autoconfigure.implementation.servicebus; import com.azure.messaging.servicebus.ServiceBusClientBuilder; +import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusConnectionDetails; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusProperties; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusPropertiesConfiguration; import com.azure.spring.cloud.core.customizer.AzureServiceClientBuilderCustomizer; @@ -62,4 +63,14 @@ StaticConnectionStringProvider staticServiceBusConn this.serviceBusProperties.getConnectionString()); } + @Bean + @ConditionalOnBean(AzureServiceBusConnectionDetails.class) + @ConditionalOnMissingBean(value = AzureServiceType.ServiceBus.class, parameterizedContainer = ServiceConnectionStringProvider.class) + StaticConnectionStringProvider staticServiceBusConnectionDetailsConnectionStringProvider( + AzureServiceBusConnectionDetails connectionDetails) { + + return new StaticConnectionStringProvider<>(AzureServiceType.SERVICE_BUS, + connectionDetails.getConnectionString()); + } + } diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java index 5f6a25b49b9d..62d554eb6741 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfigurationTests.java @@ -7,6 +7,8 @@ import com.azure.messaging.eventhubs.EventHubClientBuilder; import com.azure.spring.cloud.autoconfigure.implementation.TestBuilderCustomizer; import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.implementation.eventhubs.properties.AzureEventHubsConnectionDetails; +import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider; import com.azure.spring.cloud.service.implementation.eventhubs.factory.EventHubClientBuilderFactory; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -98,6 +100,44 @@ void userDefinedEventHubsClientBuilderProvidedShouldNotAutoconfigure() { }); } + @Test + void connectionStringPropertyRegistersStaticProvider() { + String connectionString = String.format(CONNECTION_STRING_FORMAT, "test-namespace"); + this.contextRunner + .withPropertyValues( + "spring.cloud.azure.eventhubs.connection-string=" + connectionString + ) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) + .run(context -> { + assertThat(context).hasSingleBean(StaticConnectionStringProvider.class); + assertThat(context.getBean(StaticConnectionStringProvider.class).getConnectionString()) + .isEqualTo(connectionString); + }); + } + + @Test + void connectionDetailsRegistersStaticProvider() { + String connectionString = String.format(CONNECTION_STRING_FORMAT, "details-namespace"); + this.contextRunner + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) + .withBean(AzureEventHubsConnectionDetails.class, () -> new TestConnectionDetails(connectionString)) + .run(context -> { + assertThat(context).hasSingleBean(StaticConnectionStringProvider.class); + assertThat(context.getBean(StaticConnectionStringProvider.class).getConnectionString()) + .isEqualTo(connectionString); + }); + } + + @Test + void namespaceOnlyDoesNotRegisterStaticProvider() { + this.contextRunner + .withPropertyValues( + "spring.cloud.azure.eventhubs.namespace=test-namespace" + ) + .withBean(AzureGlobalProperties.class, AzureGlobalProperties::new) + .run(context -> assertThat(context).doesNotHaveBean(StaticConnectionStringProvider.class)); + } + private static class EventHubBuilderCustomizer extends TestBuilderCustomizer { } @@ -106,4 +146,17 @@ private static class OtherBuilderCustomizer extends TestBuilderCustomizer assertThat(context).doesNotHaveBean(StaticConnectionStringProvider.class)); + } +} diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfigurationTests.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfigurationTests.java index 83c1f2d1ed47..cde00bb3389c 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfigurationTests.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/test/java/com/azure/spring/cloud/autoconfigure/implementation/servicebus/AzureServiceBusClientBuilderConfigurationTests.java @@ -7,6 +7,7 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder; import com.azure.spring.cloud.autoconfigure.implementation.TestBuilderCustomizer; import com.azure.spring.cloud.autoconfigure.implementation.context.properties.AzureGlobalProperties; +import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusConnectionDetails; import com.azure.spring.cloud.autoconfigure.implementation.servicebus.properties.AzureServiceBusProperties; import com.azure.spring.cloud.core.provider.connectionstring.StaticConnectionStringProvider; import com.azure.spring.cloud.core.service.AzureServiceType; @@ -31,7 +32,7 @@ void noConnectionInfoProvidedShouldNotConfigure() { } @Test - @SuppressWarnings("rawtypes") + @SuppressWarnings({"rawtypes", "unchecked"}) void connectionStringProvidedShouldConfigure() { contextRunner .withPropertyValues( @@ -89,6 +90,20 @@ void configureWithNamespaceAndEmptyConnectionString() { }); } + @Test + @SuppressWarnings({"rawtypes", "unchecked"}) + void connectionDetailsRegistersStaticProvider() { + String connectionString = String.format(CONNECTION_STRING_FORMAT, "details-namespace"); + this.contextRunner + .withBean(AzureServiceBusConnectionDetails.class, () -> new TestConnectionDetails(connectionString)) + .run(context -> { + assertThat(context).hasSingleBean(StaticConnectionStringProvider.class); + StaticConnectionStringProvider provider = context.getBean(StaticConnectionStringProvider.class); + assertThat(provider.getConnectionString()).isEqualTo(connectionString); + assertThat(provider.getServiceType()).isEqualTo(AzureServiceType.SERVICE_BUS); + }); + } + private static class ServiceBusBuilderCustomizer extends TestBuilderCustomizer { } @@ -97,4 +112,17 @@ private static class OtherBuilderCustomizer extends TestBuilderCustomizer Date: Wed, 11 Feb 2026 10:47:40 +0800 Subject: [PATCH 31/31] Fix un failure --- .../eventhubs/AzureEventHubsClientBuilderConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java index e895d3ee2f96..43f98426b7ea 100644 --- a/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java +++ b/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/eventhubs/AzureEventHubsClientBuilderConfiguration.java @@ -16,8 +16,8 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -60,7 +60,7 @@ EventHubClientBuilderFactory eventHubClientBuilderFactory( } @Bean - @ConditionalOnProperty(value = "spring.cloud.azure.eventhubs.connection-string") + @ConditionalOnExpression("'${spring.cloud.azure.eventhubs.connection-string:}' != ''") @ConditionalOnMissingBean(value = AzureServiceType.EventHubs.class, parameterizedContainer = ServiceConnectionStringProvider.class) StaticConnectionStringProvider eventHubsStaticConnectionStringProvider() { return new StaticConnectionStringProvider<>(AzureServiceType.EVENT_HUBS,