You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:00:31