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

Spring Boot 2.6.11中配置ActiveMQ与WebSphere MQ双JmsTemplate

问题解答

是否需要手动配置两者?

是的,必须手动区分配置ActiveMQ和WebSphere MQ的JmsTemplate。因为Spring Boot默认只会自动配置一个JmsTemplate实例,当同时存在两个MQ连接时,需要明确创建各自的连接工厂和JmsTemplate,避免Bean冲突,同时方便业务代码按需注入使用。

具体操作步骤

1. 调整ActiveMQ的现有配置

给ActiveMQ的JmsTemplate指定唯一的Bean名称,方便后续注入时区分:

@Bean("activeMqJmsTemplate") // 添加名称标识
public JmsTemplate jmsTemplate() {
    return new JmsTemplate(activeMQConnectionFactory());
}

其余ActiveMQ的Queue、ConnectionFactory Bean保持不变即可。

2. 配置WebSphere MQ的JmsTemplate

由于你已经引入了mq-jms-spring-boot-starter并配置了WMQ属性,Spring Boot会自动创建MQConnectionFactory实例。基于这个自动配置的连接工厂,我们可以直接创建WMQ专属的JmsTemplate:

import com.ibm.mq.jms.MQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.beans.factory.annotation.Value;

@Configuration
public class WmqJmsConfiguration {

    @Bean("wmqJmsTemplate")
    public JmsTemplate wmqJmsTemplate(MQConnectionFactory mqConnectionFactory,
                                      @Value("${ibm.mq.queueName}") String defaultQueue) {
        JmsTemplate jmsTemplate = new JmsTemplate(mqConnectionFactory);
        // 设置默认发送队列,可选,业务代码也可以在发送时指定队列
        jmsTemplate.setDefaultDestinationName(defaultQueue);
        return jmsTemplate;
    }
}

如果需要自定义WMQ连接工厂的更多属性(比如传输类型、超时等),也可以手动创建MQConnectionFactory:

import com.ibm.mq.jms.MQConnectionFactory;
import com.ibm.msg.client.wmq.WMQConstants;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;
import javax.jms.JMSException;

@Configuration
public class WmqJmsConfiguration {

    @Bean
    public MQConnectionFactory mqConnectionFactory(
            @Value("${ibm.mq.queueManager}") String queueManager,
            @Value("${ibm.mq.channel}") String channel,
            @Value("${ibm.mq.connName}") String connName,
            @Value("${ibm.mq.connPort}") int connPort,
            @Value("${ibm.mq.user}") String user,
            @Value("${ibm.mq.password}") String password) throws JMSException {
        MQConnectionFactory factory = new MQConnectionFactory();
        factory.setQueueManager(queueManager);
        factory.setChannel(channel);
        // 设置连接地址格式:主机(端口)
        factory.setConnectionNameList(connName + "(" + connPort + ")");
        factory.setUserName(user);
        factory.setPassword(password);
        // 设置客户端模式
        factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
        return factory;
    }

    @Bean("wmqJmsTemplate")
    public JmsTemplate wmqJmsTemplate(MQConnectionFactory mqConnectionFactory,
                                      @Value("${ibm.mq.queueName}") String defaultQueue) {
        JmsTemplate jmsTemplate = new JmsTemplate(mqConnectionFactory);
        jmsTemplate.setDefaultDestinationName(defaultQueue);
        return jmsTemplate;
    }
}

3. 业务代码中按需注入使用

在消费ActiveMQ的类中,注入ActiveMQ的JmsTemplate:

import org.springframework.jms.core.JmsTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class ActiveMqConsumer {

    private final JmsTemplate activeMqJmsTemplate;

    // 通过@Qualifier指定Bean名称注入
    public ActiveMqConsumer(@Qualifier("activeMqJmsTemplate") JmsTemplate activeMqJmsTemplate) {
        this.activeMqJmsTemplate = activeMqJmsTemplate;
    }

    // 消费逻辑...
}

在向WebSphere MQ发布数据的类中,注入WMQ的JmsTemplate:

import org.springframework.jms.core.JmsTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class WmqProducer {

    private final JmsTemplate wmqJmsTemplate;

    public WmqProducer(@Qualifier("wmqJmsTemplate") JmsTemplate wmqJmsTemplate) {
        this.wmqJmsTemplate = wmqJmsTemplate;
    }

    public void sendMessage(String message) {
        wmqJmsTemplate.convertAndSend(message);
        // 或者指定队列发送:wmqJmsTemplate.convertAndSend("目标队列名", message);
    }
}

内容的提问来源于stack exchange,提问作者shruti garg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:14:53