1. 程式人生 > 其它 >springAMQP-模糊匹配(topic)模式

springAMQP-模糊匹配(topic)模式

技術標籤:rabbmitMQjava

package com.example.demo.framework.mq;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 模糊匹配
 * 定義路由鍵匹配規則
 * a.b.c
 * a表示性別  boy男,gril女
 * b表示國籍  中國china , 美國us , 英國ua
 * c表示愛好  sing唱歌 dancing跳舞
 * 例項 愛唱歌的中國男 boy.china.sing
 *     中國人         *.china.*
 *     男人          boy.*.* || boy.#
 *     *(星號)可以代替一個單詞。
 *     #(雜湊)可以替代零個或多個單詞。
 */
@Configuration public class MqTopic { /** 交換機名稱 */ public static String Exchange_Name = "topicExchange"; /** 佇列名稱 */ public static String Queue_Name1 = "topic1"; /** 佇列名稱 */ public static String Queue_Name2 = "topic2"; /** 佇列名稱 */ public static
String Queue_Name3 = "topic3"; /** 批量佇列名稱 */ public static String Queue_Batch_Name = "topicQueueBatch"; /** 路由鍵 */ public static String Rout_key1 = "*.china.*"; public static String Rout_key2 = "boy.#"; public static String Rout_key3 = "#.sing"
; public static String Rout_key_Batch = "topic.batch"; /** * 宣告佇列 * @return */ @Bean Queue myQueue1() { return new Queue(Queue_Name1); } @Bean Queue myQueue2() { return new Queue(Queue_Name2); } @Bean Queue myQueue3() { return new Queue(Queue_Name3); } @Bean Queue batchQueueTopic() { return new Queue(Queue_Batch_Name); } /** * SpringAMQP 提供了各種型別的交換機型別 * DirectExchange 1v1佇列 * FanoutExchange 廣播模式 * HeadersExchange 頭模式 不是很瞭解這個模式 * TopicExchange 模糊匹配模式 正在使用 * @return */ @Bean TopicExchange bindTopicExchange(){ /** * 構造一個新的Exchange,併為其指定名稱,永續性標誌和自動刪除標誌以及*引數。 * @param name 交換的名稱。 * @param durable 如果我們宣告一個持久交換(交換將在伺服器重啟後保留),則為true * @param autoDelete 如果伺服器在不再使用該交換時應刪除該交換,則為true * @param arguments 用於宣告交換的引數 */ return new TopicExchange(Exchange_Name,false,true,null); } /** * 將交換機與佇列繫結同時設定路由鍵 * @return */ @Bean Binding topicBindingOne(){ return BindingBuilder.bind(myQueue3()).to(bindTopicExchange()).with(Rout_key3); } @Bean Binding topicBindingtwo(){ return BindingBuilder.bind(myQueue2()).to(bindTopicExchange()).with(Rout_key2); } @Bean Binding topicBindingthere(){ return BindingBuilder.bind(myQueue1()).to(bindTopicExchange()).with(Rout_key1); } @Bean Binding topicBindingBatch(){ return BindingBuilder.bind(batchQueueTopic()).to(bindTopicExchange()).with(Rout_key_Batch); } }

舉個例子:一個會接收帶中國標誌的訊息佇列 一個會接收帶唱歌的訊息佇列 一個會接收帶男性的訊息佇列,通過宣告需要某種標籤的佇列來接收對應標籤的訊息
先說下規則

 * a.b.c
 * a表示性別  boy男,gril女
 * b表示國籍  中國china , 美國us , 英國ua
 * c表示愛好  sing唱歌 dancing跳舞
 * 例項 愛唱歌的中國男 boy.china.sing
 *     中國人         *.china.*
 *     男人          boy.*.* || boy.#
 *     *(星號)可以代替一個單詞。
 *     #(雜湊)可以替代零個或多個單詞。

模糊匹配的主要是指定好路由鍵 模糊匹配是根據路由鍵來匹配的
交換機和佇列只是個繫結關係 真正的路由模糊匹配是路由鍵的原因
你可以定義多個佇列來繫結不同訊息標籤的路由鍵 從而實現不同的佇列接收不同型別的訊息

示例:定義一個接收帶男人標籤的佇列

//模糊匹配帶男人的訊息
 @Bean
    Binding topicBindingOne(){
        return BindingBuilder.bind(new Queue("boyQueue")).to(new TopicExchange("boy_exchange",false,true,null)).with("boy.#");
    }

訊息監聽

package com.example.demo.modules.rabbitMQ;


import com.example.demo.framework.mq.MqDirect;
import com.sun.istack.internal.logging.Logger;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class MQListener {

    private Logger log = Logger.getLogger(MQListener.class);


    /**
     * 中國
     * @param msg
     */
    @RabbitListener(queues = "topic1")
    public void topic1(String msg){
        log.info("topic1監聽到的訊息--中國--->"+msg);
    }

    /**
     * 男
     * @param msg
     */
    @RabbitListener(queues = "topic2")
    public void topic2(String msg){
        log.info("topic2監聽到的訊息--男--->"+msg);
    }

    /**
     * 唱歌
     * @param msg
     */
    @RabbitListener(queues = "topic3")
    public void topic3(String msg){
        log.info("topic3監聽到的訊息--唱歌--->"+msg);
    }
}

傳送訊息

package com.example.demo;

import com.example.demo.framework.mq.MqDirect;
import com.example.demo.framework.mq.MqFanout;
import com.example.demo.framework.mq.MqTopic;
import com.rabbitmq.client.Channel;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.connection.Connection;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.BatchingRabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;

@SpringBootTest
class RabbmitMqApplicationTests {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    void topic(){
        //中國人
        rabbitTemplate.convertAndSend
                (MqTopic.Exchange_Name,"boy.china.sing",getMsg("男","中國","唱歌"));
        rabbitTemplate.convertAndSend
                (MqTopic.Exchange_Name,"girl.china.dancing",getMsg("女","中國","跳舞"));
        //唱歌的人
        rabbitTemplate.convertAndSend
                (MqTopic.Exchange_Name,"girl.us.sing",getMsg("女","美國","唱歌"));
        //男人
        rabbitTemplate.convertAndSend
                (MqTopic.Exchange_Name,"boy.ua.dancing",getMsg("男","英國","跳舞"));
    }



    public String getMsg(String 性別,String 國籍,String 愛好){
        String msg = "性別:{a},國籍:{b},愛好:{c}";
        return msg.replace("{a}",性別)
                .replace("{b}",國籍)
                .replace("{c}",愛好);
    }
}

檢視列印結果
在這裡插入圖片描述
在這裡插入圖片描述

github:https://github.com/843679400/SpringAMQP.git