使用spring-cloud-azure-starter-servicebus连接Azure Service Bus遇订阅为空错误
问题:Spring Cloud Azure Service Bus 启动报错 "Subscription cannot be null"
背景信息
尝试使用spring-cloud-azure-starter-servicebus连接Azure Service Bus Topic,配置了订阅名但启动时提示订阅不能为空。相关配置与代码如下:
POM依赖
<properties> <java.version>17</java.version> <spring-cloud-azure.version>5.9.1</spring-cloud-azure.version> <spring-cloud.version>2023.0.0</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Azure Service bus --> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-servicebus</artifactId> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-messaging-servicebus</artifactId> <version>7.15.0</version> </dependency> </dependencies>
Java配置类
@Configuration(proxyBeanMethods = false) @Slf4j public class ProcessorClientConfiguration { @Bean ServiceBusRecordMessageListener processMessage() { return context -> { ServiceBusReceivedMessage message = context.getMessage(); log.info("Processing message. Id: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(), message.getSequenceNumber(), message.getBody()); }; } @Bean ServiceBusErrorHandler processError() { return context -> { log.error("Error when receiving messages from namespace: '%s'. Entity: '%s'%n", context.getFullyQualifiedNamespace(), context.getEntityPath()); }; } }
application.properties配置
spring.cloud.azure.servicebus.namespace=Endpoint=sb://sbns-... spring.cloud.azure.servicebus.entity-name=data-preprod spring.cloud.azure.servicebus.processor.subscription-name=data-preprod spring.cloud.azure.servicebus.entity-type=topic
错误日志
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.azure.messaging.servicebus.ServiceBusClientBuilder$ServiceBusReceiverClientBuilder]: Factory method 'serviceBusReceiverClientBuilder' threw exception with message: Subscription cannot be null. at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:177) ~[spring-beans-6.1.3.jar!/:6.1.3] at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:647) ~[spring-beans-6.1.3.jar!/:6.1.3] ... 26 common frames omitted Caused by: java.lang.IllegalArgumentException: Subscription cannot be null.
解决方案
1. 修正配置项名称
在Spring Cloud Azure 5.x版本中,Topic订阅名的正确配置项应为spring.cloud.azure.servicebus.subscription-name,而非spring.cloud.azure.servicebus.processor.subscription-name。修改application.properties:
spring.cloud.azure.servicebus.namespace=Endpoint=sb://sbns-... spring.cloud.azure.servicebus.entity-name=data-preprod spring.cloud.azure.servicebus.subscription-name=data-preprod spring.cloud.azure.servicebus.entity-type=topic
2. 移除重复依赖
spring-cloud-azure-starter-servicebus已经包含了azure-messaging-servicebus,无需单独引入,否则可能导致版本冲突。删除POM中的以下依赖:
<dependency> <groupId>com.azure</groupId> <artifactId>azure-messaging-servicebus</artifactId> <version>7.15.0</version> </dependency>
3. 确认Azure资源配置
确保Azure Service Bus中已创建名为data-preprod的Topic,且该Topic下存在名为data-preprod的订阅。如果订阅不存在,需先在Azure Portal中创建对应订阅。
验证修改
完成上述调整后,重新启动应用,应该能正常初始化Service Bus Processor客户端,不再出现"Subscription cannot be null"的错误。
内容的提问来源于stack exchange,提问作者user3222372
相关产品推荐
相关产品推荐

