springAMQP-模糊匹配(topic)模式
阿新 • • 發佈:2021-01-01
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}",愛好);
}
}
檢視列印結果