迁移中向现有JMS队列发送消息的问题求助
解决方案
1. 修正消息发送的目的地
原XML配置的是向VirtualTopic.send.email这个虚拟主题发送消息,你当前代码里用的Virtual.send.email是错误的,需要替换为正确的主题名称:
private void sendToJms(String message) { try { System.out.println("Sending an email message."); // 使用正确的虚拟主题名称 jmsTemplate.convertAndSend("VirtualTopic.send.email", message); } catch (Exception e) { System.out.println("--------------- Exception ---------------" + e.getMessage()); } }
2. 配置Topic类型的ConnectionFactory
原XML指定使用myTopicConnectionFactory主题连接工厂,Spring默认的ConnectionFactory是Queue类型,需要额外配置Topic专用的连接工厂:
@Configuration public class JmsConfig { @Value("${spring.activemq.broker-url}") private String brokerUrl; @Value("${spring.activemq.username}") private String username; @Value("${spring.activemq.password}") private String password; // 定义主题连接工厂,对应原XML的myTopicConnectionFactory @Bean(name = "myTopicConnectionFactory") public TopicConnectionFactory topicConnectionFactory() { ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); factory.setBrokerURL(brokerUrl); factory.setUserName(username); factory.setPassword(password); factory.setTrustAllPackages(true); return factory; } // 配置使用主题连接工厂的JmsTemplate @Bean(name = "topicJmsTemplate") public JmsTemplate topicJmsTemplate(@Qualifier("myTopicConnectionFactory") TopicConnectionFactory connectionFactory) { JmsTemplate jmsTemplate = new JmsTemplate(); jmsTemplate.setConnectionFactory(connectionFactory); // 明确设置为发布订阅模式(Topic模式) jmsTemplate.setPubSubDomain(true); return jmsTemplate; } }
3. 注入正确的JmsTemplate
在你的消息发送类中,注入上面配置的topicJmsTemplate,替代默认的Queue类型JmsTemplate:
@Autowired @Qualifier("topicJmsTemplate") private JmsTemplate jmsTemplate;
4. 修正监听器的目的地(适配虚拟主题机制)
ActiveMQ虚拟主题的消费者需要监听Consumer.[消费者组名].VirtualTopic.send.email格式的队列,如果你需要正确接收虚拟主题的消息,监听器可以调整为:
@JmsListener(destination = "Consumer.myApp.VirtualTopic.send.email") private void listener(String message, @Header(JmsHeaders.DESTINATION) String destination) { try { LOG.info("--------------------- message ----------------------- {}", message); LOG.info("--------------------- destination ----------------------- {}", destination); } catch (Exception e) { LOG.error("Error", e); } }
以上配置完全匹配原XML的功能:向VirtualTopic.send.email虚拟主题发送消息,使用指定的主题连接工厂,同时遵循ActiveMQ虚拟主题的路由机制。
内容的提问来源于stack exchange,提问作者Shyamali
相关产品推荐
相关产品推荐

