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

在WildFly 27部署SpringBoot应用连接Azure ServiceBus遇订阅错误求助

在WildFly 27中部署Spring Boot JMS应用连接Azure Service Bus的问题

问题描述

尝试在WildFly 27中运行Spring Boot应用,实现连接并监听Azure Service Bus的JMS消息。使用嵌入式Tomcat启动时代码运行正常,但排除Tomcat并将相同war包部署到WildFly后无法工作,报错信息如下:

错误原因:Cannot create durable subscription - client ID has not been set

相关代码及配置

应用启动类

@SpringBootApplication
@EnableJms
public class JiraServiceBusApplication  extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(JiraServiceBusApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(JiraServiceBusApplication.class);
    }
    
}

JMS监听器代码

@JmsListener(destination = TOPIC_NAME, containerFactory = "topicJmsListenerContainerFactory",
        subscription = SUBSCRIPTION_NAME, concurrency = "1")
public void receiveMessage(Message message) throws JMSException {
    // 消息处理逻辑
}

配置文件内容

spring.jms.servicebus.connection-string=Endpoint=sb://xxxxxxxx.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxxxxxxxxxxxxxx+ASbJ7sBvY=
spring.jms.servicebus.topic-client-id=xxxxxxxxx-xxxxxxxxx-xxxxxxxx
spring.jms.servicebus.pricing-tier=standard

解决方案

1. 手动配置JmsListenerContainerFactory

WildFly环境下Spring Boot的自动配置可能无法正确传递client-id到JMS容器,需要手动构建容器工厂并显式设置参数:

@Configuration
public class JmsConfig {

    @Value("${spring.jms.servicebus.topic-client-id}")
    private String topicClientId;

    @Autowired
    private ConnectionFactory connectionFactory;

    @Bean("topicJmsListenerContainerFactory")
    public DefaultJmsListenerContainerFactory topicJmsListenerContainerFactory() {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        // 强制设置client-id,解决持久化订阅创建失败问题
        factory.setClientId(topicClientId);
        // 明确开启持久化订阅支持
        factory.setSubscriptionDurable(true);
        return factory;
    }
}

2. 排除WildFly自带JMS自动配置(可选)

若WildFly内置的JMS组件与Spring Boot配置冲突,可在启动类中排除相关自动配置:

@SpringBootApplication(exclude = {JmsAutoConfiguration.class})
@EnableJms
public class JiraServiceBusApplication extends SpringBootServletInitializer {
    // 原有代码保持不变
}

3. 检查WildFly部署配置

确认WildFly的standalone.xml中没有配置冲突的JMS连接工厂,避免Spring Boot的ConnectionFactory被覆盖。如果不需要WildFly自带的JMS资源,可暂时禁用相关配置。

4. 验证Azure Service Bus配置

确保配置的SharedAccessKey拥有创建持久化订阅的权限,同时确认Azure Service Bus的定价层确实为Standard(仅Standard层支持持久化订阅)。

内容的提问来源于stack exchange,提问作者Gagan Noor Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:41:22