spring boot配置多mq

spring boot配置多mq

把spring项目重构成springboot架构,遇到mq配置问题,刚开始利用springboot默认的mq配置简单声明了队列,发现只有一个mq配置生效,另外一个未注册成功。
这里记录下spring boot配置多mq:手动创建mq连接,监听不同链接下的队列消费mq消息
代码如下:

package com;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * springboot多个mq配置
 * @author
 */
@Configuration
public class MultiSpringBootMqConfig {

    @Value("${aHost}")
    private String aHost;
    @Value("${aPort}")
    private int aPort;
    @Value("${aUserName}")
    private String aUserName;
    @Value("${aUserPwd}")
    private String aUserPwd;
    @Value("${aVirtualHost}")
    private String aVirtualHost;
    @Value("${aDirectExchange}")
    private String aDirectExchange;
    /**
     * 队列名
     */
    private static final String A_QUEUE = "a_queue";

    @Value("${bHost}")
    private String bHost;
    @Value("${bPort}")
    private int bPort;
    @Value("${bUserName}")
    private String bUserName;
    @Value("${bUserPwd}")
    private String bUserPwd;
    @Value("${bVirtualHost}")
    private String bVirtualHost;
    @Value("${bDirectExchange}")
    private String bDirectExchange;
    @Value("${bRoutingKey}")
    private String bRoutingKey;
    /**
     * 队列名
     */
    private static final String B_QUEUE = "b_queue";

    /**
     * a mq配置
     * @Primary 优先
     * @return
     */
    @Bean(name="aMqConnectionFactory")
    @Primary
    public ConnectionFactory aMqConnectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(aHost);
        connectionFactory.setPort(aPort);
        connectionFactory.setUsername(aUserName);
        connectionFactory.setPassword(aUserPwd);
        connectionFactory.setVirtualHost(aVirtualHost);

        return connectionFactory;
    }

    @Bean(name="aRabbitTemplate")
    @Primary
    public RabbitTemplate aRabbitTemplate(
            @Qualifier("aMqConnectionFactory") ConnectionFactory connectionFactory){
        RabbitTemplate hPayRabbitTemplate = new RabbitTemplate(connectionFactory);
        //使用外部事物
        //lpzRabbitTemplate.setChannelTransacted(true);
        return hPayRabbitTemplate;
    }

    @Bean(name="aMqContainerFactory")
    public SimpleRabbitListenerContainerFactory aMqContainerFactory(
            SimpleRabbitListenerContainerFactoryConfigurer configurer,
            @Qualifier("aMqConnectionFactory") ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }

    @Bean
    public DirectExchange aDirectExchange() {
        return new DirectExchange(aDirectExchange, true, false);
    }

    @Bean
    public Queue aQueue() {
        // 第一个参数是队列名字, 第二个参数是指是否持久化
        return new Queue(A_QUEUE, true);
    }

    @Bean
    public Binding aBind() {
        // with(A_QUEUE);  routingKey
        return BindingBuilder.bind(aQueue()).to(aDirectExchange()).with(A_QUEUE);
    }


    /**
     * b配置
     * @return
     */
    @Bean(name="bMqConnectionFactory")
    public ConnectionFactory bMqConnectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(bHost);
        connectionFactory.setPort(bPort);
        connectionFactory.setUsername(bUserName);
        connectionFactory.setPassword(bUserPwd);
        connectionFactory.setVirtualHost(bVirtualHost);

        return connectionFactory;
    }

    @Bean(name="bRabbitTemplate")
    public RabbitTemplate bRabbitTemplate(
            @Qualifier("bMqConnectionFactory") ConnectionFactory connectionFactory){
        RabbitTemplate hPayRabbitTemplate = new RabbitTemplate(connectionFactory);
        //使用外部事物
        //lpzRabbitTemplate.setChannelTransacted(true);
        return hPayRabbitTemplate;
    }

    @Bean(name="bMqContainerFactory")
    public SimpleRabbitListenerContainerFactory bMqContainerFactory(
            SimpleRabbitListenerContainerFactoryConfigurer configurer,
            @Qualifier("bMqConnectionFactory") ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }

    @Bean
    public DirectExchange bDirectExchange() {
        return new DirectExchange(bDirectExchange, true, false);
    }

    @Bean
    public Queue bQueue() {
        // 第一个参数是队列名字, 第二个参数是指是否持久化
        return new Queue(B_QUEUE, true);
    }

    @Bean
    public Binding bBind() {
        return BindingBuilder.bind(bQueue()).to(bDirectExchange()).with(bRoutingKey);
    }

}

增加指定虚拟机注册交换机,队列等方法
exchangeName, queueName 可以自定义

/**
     * 消息交换机
     * @return
     */
    @Bean
    public String screenMessageExchange(@Qualifier("bMqConnectionFactory") ConnectionFactory connectionFactory) {
        log.info("声明消息交换机 :{}", bDirectExchange);
        try {
            connectionFactory.createConnection()
                    .createChannel(false)
                    .exchangeDeclare(exchangeName,
                            BuiltinExchangeType.FANOUT, true, false, false, null);
        } catch (IOException e) {
            log.error("声明消息交换机异常:{}", e.getMessage());
        }

        return exchangeName;
    }
    
/**
     * 如果要在第二个mq中也创建队列hello1,那么需要指定数据源secondConnectionFactory
     * @param connectionFactory
     * @return
     */
    @Bean
    public String screenMessageQueue(@Qualifier("bMqConnectionFactory") ConnectionFactory connectionFactory) {
        log.info("声明消息队列 :{}", queueName);
        try {
            connectionFactory.createConnection()
                    .createChannel(false)
                    .queueDeclare(queueName, true, false, false, null);
        }catch (IOException e){
            log.error("声明消息队列异常:{}", e.getMessage());
        }

        return queueName;
    }

接收消息类:

public class MqTest {

    @RabbitListener(queues = MultiSpringBootMqConfig.A_QUEUE,
            containerFactory="aMqContainerFactory")
    @RabbitHandler
    public void aTest(Message message, Channel channel) {
        System.out.println("hello, a mq收到消息");
    }

    @RabbitListener(queues = MultiSpringBootMqConfig.B_QUEUE,
            containerFactory="bMqContainerFactory")
    @RabbitHandler
    public void bTest(Message message, Channel channel) {
        System.out.println("hello, b mq收到消息");
    }
}

以上仅供参考,技术无界,大佬们有更好的更简单方便的方法,可以分享出来共同学习。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用Spring Boot框架搭建MQ的步骤: 1.首先,在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2.在application.properties文件中添加以下配置: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3.创建一个消息生产者类,用于发送消息到MQ: ```java import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MessageProducer { @Autowired private AmqpTemplate amqpTemplate; public void sendMessage(String message) { amqpTemplate.convertAndSend("queueName", message); } } ``` 4.创建一个消息消费者类,用于从MQ接收消息: ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class MessageConsumer { @RabbitListener(queues = "queueName") public void receiveMessage(String message) { System.out.println("Received message: " + message); } } ``` 5.在启动类中添加@EnableRabbit注解,启用RabbitMQ: ```java import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableRabbit public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 以上就是使用Spring Boot框架搭建MQ的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值