Sonic MQ 12.0与Spring Boot 3.3.1连接失败问题求助
Spring Boot 3.3.1 + Sonic MQ(Jakarta环境)监听器配置方案
1. 解决Jakarta依赖缺失问题
progress.message.jclient.TopicConnectionFactory是Sonic MQ的客户端类,Spring Boot 3.x完全基于Jakarta EE,必须引入Sonic MQ的Jakarta适配版客户端依赖,而非旧Java EE版本。
Maven配置(pom.xml)
<dependency> <groupId>com.progress</groupId> <artifactId>sonic-jms-client-jakarta</artifactId> <version>对应你的Sonic MQ Jakarta版本号</version> <!-- 若使用私有仓库,需补充仓库地址配置 --> </dependency>
Gradle配置
implementation 'com.progress:sonic-jms-client-jakarta:对应你的Sonic MQ Jakarta版本号'
注意:Sonic MQ 10.x及以上版本通常提供Jakarta适配的客户端包,请确认版本兼容性。
2. 手动配置Sonic TopicConnectionFactory
Spring Boot的spring-boot-starter-jms默认适配通用JMS实现,不会自动配置Sonic的连接工厂,需手动创建Bean:
import jakarta.jms.TopicConnectionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import progress.message.jclient.TopicConnectionFactoryImpl; @Configuration public class SonicJmsConfig { @Bean public TopicConnectionFactory sonicTopicConnectionFactory() { TopicConnectionFactoryImpl factory = new TopicConnectionFactoryImpl(); // 设置Sonic MQ服务地址,格式:tcp://host:port factory.setServerUrl("tcp://你的SonicMQ地址:2506"); // 按需配置用户名密码 factory.setUsername("你的用户名"); factory.setPassword("你的密码"); return factory; } }
3. 配置Jakarta版JMS监听器容器
Spring Boot 3.x使用Jakarta JMS API,需基于DefaultJakartaJmsListenerContainerFactory配置监听器容器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.config.DefaultJakartaJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory; import jakarta.jms.TopicConnectionFactory; @Configuration public class JmsListenerConfig { @Bean public JmsListenerContainerFactory<?> jmsTopicListenerContainerFactory(TopicConnectionFactory sonicTopicConnectionFactory) { DefaultJakartaJmsListenerContainerFactory factory = new DefaultJakartaJmsListenerContainerFactory(); factory.setConnectionFactory(sonicTopicConnectionFactory); // 按需开启持久化订阅 factory.setSubscriptionDurable(true); // 持久化订阅必须设置唯一客户端ID factory.setClientId("你的客户端ID"); return factory; } }
4. 编写Topic监听器
使用@JmsListener注解绑定目标Topic和容器工厂:
import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; import jakarta.jms.Message; import jakarta.jms.TextMessage; @Component public class SonicTopicListener { @JmsListener(destination = "你的目标Topic名称", containerFactory = "jmsTopicListenerContainerFactory") public void onMessage(Message message) { try { if (message instanceof TextMessage textMessage) { String content = textMessage.getText(); // 这里编写你的消息处理逻辑 System.out.println("收到消息: " + content); } } catch (Exception e) { // 按需处理异常 e.printStackTrace(); } } }
5. 常见问题排查
- 若仍提示Jakarta类缺失,检查是否误引入旧版
sonic-jms-client(Java EE版),必须用sonic-jms-client-jakarta。 - 确认
spring-boot-starter-jms已自动引入Jakarta JMS API,无需额外添加jakarta.jms:jakarta.jms-api依赖。 - 检查Sonic MQ服务器的端口、权限配置,确保客户端能正常连接。
内容的提问来源于stack exchange,提问作者Nageshwar
相关产品推荐
相关产品推荐

