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

迁移中向现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:26