Springboot中使用多个AMQ

本文介绍了Springboot如何在项目中配置并使用多个AMQ。当仅需一个AMQ时,简单的配置文件设置即可实现。但当需要连接多个,如18mq和19mq,就需要编写自定义的JMS配置类。消费者创建时需指定containerFactory,生产者则通过配置类中的实例名注入JmsMessagingTemplate。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.当springboot程序只用一个amq时,只需要在配置文件里面简单配置相关连接项(配置项名字不能改),得益于springboot的自动装配功能,我们不需要写额外的配置类就能在程序里面轻松使用。

2.当springboot程序需要连接多个amq时,就需要手动编写jms的配置类了,这里两个mq(18mq,19mq)

package com.brilliant.ecserver.config;

import org.apache.activemq.ActiveMQConnectionFactory;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.jms.config.DefaultJmsListenerContainerFactory;

import org.springframework.jms.config.JmsListenerContainerFactory;

import org.springframework.jms.core.JmsMessagingTemplate;

import javax.jms.ConnectionFactory;

/**

 * @ClassName AmpConfig

 * @Description ActiveMQ配置类,分别创建2个不同地址的MQ连接

 * @Author chengli

 * @Date 2021/8/17 14:04

 */

@Configuration

public class AmqConfig {

    @Bean(name = "mq19ConnectionFactory")

    public ActiveMQConnectionFactory mq19ConnectionFactory(

            @Value("${spring.activemq19.broker-url}") String brokerUrl,

            @Value("${spring.activemq19.user}") String username,

            @Value("${spring.activemq19.password}") String password) {

        return createConnectionFactory(brokerUrl, username, password);

    }

    @Bean(name = "mq19JmsTemplate")

    public JmsMessagingTemplate mq19JmsTemplate(

            @Qualifier("mq19ConnectionFactory") ActiveMQConnectionFactory connectionFactory) {

        JmsMessagingTemplate template = new JmsMessagingTemplate(connectionFactory);

        return template;

    }

    @Bean(name = "mq19JmsListenerContainerFactory")

    public JmsListenerContainerFactory mq19JmsListenerContainerFactory(

            @Qualifier("mq19ConnectionFactory") ActiveMQConnectionFactory connectionFactory) {

        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();

        factory.setPubSubDomain(true);

        factory.setConnectionFactory(connectionFactory);

        return factory;

    }

    //========================================================================================

    @Bean(name = "mq18ConnectionFactory")

    public ActiveMQConnectionFactory mq18ConnectionFactory(

            @Value("${spring.activemq18.broker-url}") String brokerUrl,

            @Value("${spring.activemq18.user}") String username,

            @Value("${spring.activemq18.password}") String password) {

        return createConnectionFactory(brokerUrl, username, password);

    }

    @Bean(name = "mq18JmsTemplate")

    public JmsMessagingTemplate mq18JmsTemplate(

            @Qualifier("mq18ConnectionFactory") ActiveMQConnectionFactory connectionFactory) {

        JmsMessagingTemplate template = new JmsMessagingTemplate(connectionFactory);

        return template;

    }

    @Bean(name = "mq18JmsListenerContainerFactory")

    public JmsListenerContainerFactory mq18JmsListenerContainerFactory(

            @Qualifier("mq18ConnectionFactory") ConnectionFactory connectionFactory) {

        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();

        factory.setPubSubDomain(true);

        factory.setConnectionFactory(connectionFactory);

        factory.setAutoStartup(true);

        return factory;

    }

    //========================================================================================

    /**

     * 创建ConnectionFactory

     * @param brokerUrl

     * @param username

     * @param password

     * @return

     */

    public ActiveMQConnectionFactory createConnectionFactory(String brokerUrl, String username, String password) {

        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();

        factory.setBrokerURL(brokerUrl);

        factory.setUserName(username);

        factory.setPassword(password);

        return factory;

    }

}

3.创建消费者的时候,注解后面加上containerFactory = "mq18JmsListenerContainerFactory")参数,指定你连接的mq

/**

     * 新能源车辆OBD数据

     * @param msg

     */

    @JmsListener(destination = "${ecserver.MQ_FROM_CLSERVER_VHSTATE}",containerFactory = "mq18JmsListenerContainerFactory")

    public void listenVehicle(Message msg) {

        vehicleMessageHandler.onMessage(msg);

    }

4.生产者的创建在自动注入JmsMessagingTemplate时,实例名写配置类中配置的名字即可mq18JmsTemplate

package com.brilliant.ecserver.amq.publishers;

import org.apache.activemq.command.ActiveMQTopic;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.jms.core.JmsMessagingTemplate;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

import javax.jms.Destination;

@Service

public class VehiclePublisher {

    @Value("${ecserver.MQ_TO_AVMS_VHSTATE}")

    private String topicName;

    private Destination destination;

    @PostConstruct

    void init(){

        destination = new ActiveMQTopic(topicName);

    }

    @Autowired

    JmsMessagingTemplate mq18JmsTemplate;

    public void sendMessage(String msg) {

        mq18JmsTemplate.convertAndSend(destination, msg);

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值