RabbitMq 广播模式 -- fanout

**

RabbitMq 广播模式 – fanout

**
1、将一条消息通过Exchange交换机分发到多个对列中,供多个消费者监听对列消费消息。

package com.sgcc.base.service.config;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMqConfig {
    @Value("${spring.rabbitmq.host}")
    public String host;
    @Value("${spring.rabbitmq.username}")
    public String username;
    @Value("${spring.rabbitmq.password}")
    public String password;
    @Bean
    RabbitMqConfig config(){
    try {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(host);
        factory.setPort(AMQP.PROTOCOL.PORT);
        factory.setUsername(username);
        factory.setPassword(password);
        Connection conn = factory.newConnection();
        // 声明一个交换机,使用FANOUT    持久化交换机(第三个参数)
        Channel channel = conn.createChannel();
        channel.exchangeDeclare(QueueEnum.FANOUT1.getExchange(), "fanout");
        channel.exchangeDeclare(QueueEnum.FANOUT2.getExchange(), "fanout");
        channel.exchangeDeclare(QueueEnum.FANOUT3.getExchange(), "fanout");
        channel.exchangeDeclare(QueueEnum.FANOUT4.getExchange(), "fanout");

        /**
         * 队列名称
         * query中俩个每一个数组中的;俩个队列都绑定一个共同的交换机
         * 将一条消息分别给俩个队列塞入,供俩个消费者监听对列消费消息
         * 同时有新增的消费者第三方只需要在添加一条队列。(注:队列名称
         * 不可以一致,区分开来方便消费者监听)
         */
        String[] queue1 = {"MALL.ORGANIZATION.MKB","MALL.ORGANIZATION.ZZ"};// 1、组织机构
        String[] queue2 = {"MALL.DEPT.MKB","MALL.DEPT.ZZ"};                // 2、部门
        String[] queue3 = {"MALL.PERSONNEL.MKB","MALL.PERSONNEL.ZZ"};      // 3、人员
        String[] queue4 = {"MALL.FACE.MKB","MALL.FACE.ZZ"};                // 4、人脸

        /**
          *以下的循环方便创建队列,并将交换机绑定队列
          */
        //组织机构
        for (int i = 0; i < queue1.length; i++) {
            channel.queueDeclare(queue1[i], true, false, false, null);
            //query绑定队列与Exchange交换机
            channel.queueBind(queue1[i], QueueEnum.FANOUT1.getExchange(), "");
        }

        //部门
        for (int i = 0; i < queue2.length; i++) {
            channel.queueDeclare(queue2[i], true, false, false, null);
            //query绑定队列与Exchange交换机
            channel.queueBind(queue2[i], QueueEnum.FANOUT2.getExchange(), "");
        }

        //人员
        for (int i = 0; i < queue3.length; i++) {
            channel.queueDeclare(queue3[i], true, false, false, null);
            //query绑定队列与Exchange交换机
            channel.queueBind(queue3[i], QueueEnum.FANOUT3.getExchange(), "");
        }

        //人脸图片
        for (int i = 0; i < queue4.length; i++) {
            channel.queueDeclare(queue4[i], true, false, false, null);
            //query绑定队列与Exchange交换机
            channel.queueBind(queue4[i], QueueEnum.FANOUT4.getExchange(), "");
        }
        channel.close();
        conn.close();
    }catch (Exception e){
    }
        return null;
    }
}

2、定义枚举方便更换交换机名称,其交换机的类型统一为fanout(广播模式)一个交换机对应多个队列。

package com.sgcc.base.service.config;

public enum QueueEnum {

     /**
       *根据业务来订多少个mq队列,从而定义队列对应的交换机
       */
    FANOUT1("organization.fanout"),
    FANOUT2("dept.fanout"),
    FANOUT3("personnel.fanout"),
    FANOUT4("face.fanout");

    /**
     * 交换名称
     */
    private String exchange;

    QueueEnum(String exchange) {
        this.exchange = exchange;
    }

    public String getExchange() {
        return exchange;
    }

    public void setExchange(String exchange) {
        this.exchange = exchange;
    }
}

3、消息发送,广播模式,通过绑定交换机将消息发送队列,所有在使用时不需要routingKey绑定。即使绑定也会忽略。

package com.sgcc.base.service.config;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
//  mq消息生产者
//多个消息生产者,则写多个方法,并且绑定不同的交换机,
//确认是不同队列,提供不同的消息方便之后业务需求
@Component
public class MqSend {
        private org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
    @Autowired
    private AmqpTemplate amqpTemplate;
    //组织机构消息生成者
    public void organizationQueues(String  msg){
        logger.info("队列数据==组织机构==>>"+msg);
        amqpTemplate.convertAndSend(
        //绑定对应的交换机。
                QueueEnum.FANOUT1.getExchange(),
                "",
                msg );

    }
}

4、消息消费。只需要知道直接需要那个队列中的消息,监听那个队列即可。


package com.sgcc.base.service.config;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
//消费者
//通过注解方式监听自己需要的消费的队列名称![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611105012721.png#pic_center)
@Component
public class MqReview {
    private org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
/**
     * 部门消费者
     * @param msg
     */

    @RabbitListener(queues = "MALL.DEPT.MKB")
    @RabbitHandler
    public void orgQueuesMkb(String  msg){
        System.out.println("输出的数据==mkb==部门"+msg);
    }
   
/**
     * 部门消费者
     * @param msg
     */

    @RabbitListener(queues = "MALL.DEPT.ZZ")
    @RabbitHandler
    public void orgQueuesZz (String  msg){
        System.out.println("输出的数据==zz==部门"+msg);
    }
}

5、这样实现了一条消息发送俩个队列,提供俩个消费者消费。在客户端也可以更好的看到队列,交换机,消息的一些信息与状态。业务需要只要在config中继续配置队列就可以增加消费者,继续配置交换机与队列就可以增加新的消息队列。方便更多的消息通知。
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值