• SpringBoot应用操作Rabbitmq(fanout广播高级操作)


    一、广播模式fanout、不需要指定路由key。

         注:与topic和direct区别是:fanout广播模式会两个队列同时发送相同的消息,并非由交换器转发到某一个队列

    二、实战(广播模式)

    1、引入maven

            <dependency>
                <groupId>org.springframework.amqp</groupId>
                <artifactId>spring-rabbit</artifactId>
            </dependency>

    2、添加配置

    spring:
      application:
        #指定应用的名字
        name: rabbit-add
      #配置rabbitmq
      rabbitmq:
      #链接主机
        host: 127.0.0.1
      #端口
        port: 5672
      #已经授权的用户账号密码
        username: user
        password: user
      #指定的虚拟主机,默认/,
        virtual-host: my_vhost
    # 自定义配置应用于topic交换器
    mq:
      config:
       #自定义交换器名称
         exchange: log.fanout
         queue:
            #自定义队列名称
            smsName: fanout.sms
            orderName: fanout.order

    3、消费者创建,坚挺着不需要指定路由键

    package com.niu.fanout;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.amqp.core.ExchangeTypes;
    import org.springframework.amqp.rabbit.annotation.*;
    import org.springframework.stereotype.Component;
    
    /**
     * @author niunafei
     * @function
     * @email niunafei0315@163.com
     * @date 2020/4/28  7:20 PM
     * @RabbitListener 自定义监听事件
     * @QueueBinding 绑定交换器与队列的关系value 指定队列exchange指定交换器
     * value= @Queue 指定配置队列的信息 value队列名称 autoDelete是否是临时队列
     * exchange= @Exchange 指定交换器 value指定交换器名称 type交换器类型
     * key  指定路由键
     */
    @Component
    @Slf4j
    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(value = "${mq.config.queue.orderName}", autoDelete = "true"),
                    exchange = @Exchange(value = "${mq.config.exchange}", type = ExchangeTypes.FANOUT))
    )
    public class OrderReceiver{
    
        /**
         * 设置监听方法
         *
         * @param msg
         * @RabbitHandler 声明监听方法是下面的 isDefault属性是默认false接受的完整对象,true接受body体
         */
        @RabbitHandler(isDefault = true)
        public void process(String msg) {
            log.info("接受到消息:order {}", msg);
        }
    }
    View Code
    package com.niu.fanout;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.amqp.core.ExchangeTypes;
    import org.springframework.amqp.rabbit.annotation.*;
    import org.springframework.stereotype.Component;
    
    /**
     * @author niunafei
     * @function
     * @email niunafei0315@163.com
     * @date 2020/4/28  7:20 PM
     * @RabbitListener 自定义监听事件
     * @QueueBinding 绑定交换器与队列的关系value 指定队列exchange指定交换器
     * value= @Queue 指定配置队列的信息 value队列名称 autoDelete是否是临时队列
     * exchange= @Exchange 指定交换器 value指定交换器名称 type交换器类型
     * key  指定路由键
     */
    @Component
    @Slf4j
    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(value = "${mq.config.queue.smsName}", autoDelete = "true"),
                    exchange = @Exchange(value = "${mq.config.exchange}", type = ExchangeTypes.FANOUT))
    )
    public class SmsReceiver {
    
        /**
         * 设置监听方法
         *  @RabbitHandler 声明监听方法是下面的 isDefault属性是默认false接受的完整对象,true接受body体
         *
         * @param msg
         */
        @RabbitHandler(isDefault = true)
        public void process(String msg) {
            log.info("接受到消息:sms {}", msg);
        }
    }
    View Code

    4、生产者创建,发送的时候只需要指定交换器即可,路由键默认空字符串

    package com.niu.fanout;
    
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /**
     * @author niunafei
     * @function
     * @email niunafei0315@163.com
     * @date 2020/4/29  9:44 AM
     */
    @Component
    public class Sender {
        /**
         * spring整合的操作类
         * Message 发送的消息对象
         * void send(Message var1) throws AmqpException;
         * <p>
         * var1 路由键 Message 发送的消息对象
         * void send(String var1, Message var2) throws AmqpException;
         * <p>
         * var1 指定交换器名称 var2 路由键 Message 发送的消息对象
         * void send(String var1, String var2, Message var3) throws AmqpException;
         *
         * convertAndSend() 方法不需要指定MessageProperties属性即可发布
         */
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Value("${mq.config.exchange}")
        private String exchange;
    
        public void send(String msg) {
            //需要指定交换器和路由键就可以转发 注路由键为null
            rabbitTemplate.convertAndSend(exchange, "", msg);
        }
    
    }
    View Code

    5、结果展示

    注意ack确认机制,容易产生数据丢失,和产生内存泄漏,消费者进行死循环,配置这两个属性进行确认。

    1、autoDelete属性设置为false

    @Queue(value = "${mq.config.queue.orderName}", autoDelete = "false"

    2、消费者进行死循环问题

    docker安装rabbitmq:rabbitMQ安装docker版 /权限管理命令

    简单应用来这里吧: SpringBoot应用操作Rabbitmq

    简单应用来这里吧: SpringBoot应用操作Rabbitmq(direct高级操作)

    简单应用来这里吧:SpringBoot应用操作Rabbitmq(topic交换器高级操作)   

    简单应用来这里吧:SpringBoot应用操作Rabbitmq(fanout广播高级操作)

  • 相关阅读:
    nextTick
    git版本管理2
    git版本管理1
    生成二维码优惠券
    JavaScript 数据类型
    scoped属性与 elementui 样式
    LINUX命令学习(持续更新)
    jenkins构建触发器定时任务Build periodically和Poll SCM
    installer,source,binary版本安装包区别
    jenkins是什么
  • 原文地址:https://www.cnblogs.com/niunafei/p/12801880.html
Copyright © 2020-2023  润新知