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

