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中繼續配置隊列就可以增加消費者,繼續配置交換機與隊列就可以增加新的消息隊列。方便更多的消息通知。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章