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广播高级操作)

posted @ 2020-04-29 14:15  albert飞的博客  阅读(3669)  评论(0编辑  收藏  举报