如何配置spring-cloud-azure-starter-servicebus-jms并解决ConnectionFactory缺失问题?
解决方案
一、让spring-cloud-azure-starter-servicebus-jms自动提供Jakarta ConnectionFactory
1. 确保依赖版本适配
使用兼容Spring Boot 3的spring-cloud-azure-starter-servicebus-jms版本(推荐4.x及以上),示例Gradle Kotlin DSL配置:
implementation("com.azure.spring:spring-cloud-azure-starter-servicebus-jms:4.12.0")
Maven配置:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId> <version>4.12.0</version> </dependency>
2. 配置Service Bus连接信息
在application.yml中配置必要属性,starter会自动创建jakarta.jms.ConnectionFactory类型的Bean:
spring: cloud: azure: servicebus: connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING} namespace: ${AZURE_SERVICEBUS_NAMESPACE}
3. 修正自定义容器工厂的注入代码
确保导入**jakarta.jms.ConnectionFactory**而非旧的javax.jms.ConnectionFactory,修正后的Kotlin代码:
import jakarta.jms.ConnectionFactory import org.springframework.jms.config.DefaultJmsListenerContainerFactory import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration class JmsConfig { @Bean fun jmsListenerContainerFactory( connectionFactory: ConnectionFactory, errorHandler: CustomErrorHandler ): DefaultJmsListenerContainerFactory { val factory = DefaultJmsListenerContainerFactory() factory.setConnectionFactory(connectionFactory) factory.setErrorHandler(errorHandler) factory.setSessionTransacted(true) return factory } }
配置完成后,Spring会自动注入starter提供的ServiceBusJmsConnectionFactory(它实现了jakarta.jms.ConnectionFactory)。
二、手动创建ConnectionFactory(备选方案)
若需手动构建,可直接实例化ServiceBusJmsConnectionFactory:
import com.azure.spring.messaging.servicebus.jms.ServiceBusJmsConnectionFactoryBuilder import jakarta.jms.ConnectionFactory import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration class JmsManualConfig { @Bean fun serviceBusConnectionFactory(): ConnectionFactory { return ServiceBusJmsConnectionFactoryBuilder() .connectionString("<你的Service Bus连接字符串>") .build() } @Bean fun jmsListenerContainerFactory( connectionFactory: ConnectionFactory, errorHandler: CustomErrorHandler ): DefaultJmsListenerContainerFactory { val factory = DefaultJmsListenerContainerFactory() factory.setConnectionFactory(connectionFactory) factory.setErrorHandler(errorHandler) factory.setSessionTransacted(true) return factory } }
关键注意事项
- 命名空间切换:Spring Boot 3完全采用Jakarta EE API,所有JMS相关类均从
javax.jms迁移至jakarta.jms,避免代码中混用旧API。 - 依赖排查:检查项目是否存在
javax.jms:jms-api等旧依赖,如有需排除,防止类加载冲突。
内容的提问来源于stack exchange,提问作者Stian Jørgensrud
相关产品推荐
相关产品推荐

