在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
相关产品推荐
相关产品推荐

