声明:本站文章均为作者个人原创,图片均为实际截图。如有需要请收藏网站,禁止转载,谢谢配合!!!

点击查看Fanout交换机教程
点击查看Topic交换机教程

本文讲解TopicExchange

主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。
简单地介绍下规则:
*(星号) 用来表示一个单词 (必须出现的)
#(井号) 用来表示任意数量(零个或多个)单词
通配的绑定键是跟队列进行绑定的,举例如下:
队列Q1 绑定键为 .TT.
队列Q2绑定键为 TT.#
如果一条消息携带的路由键为 A.TT.B,那么队列Q1将会收到;
如果一条消息携带的路由键为TT.AA.BB,那么队列Q2将会收到;

1.在发布者publisher服务中向交换机发送消息

交换机名称是badianboke.topic

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
    //发送到交换机
    @Test
    public void testSendDirectExchange(){
        String exchangeName = "badianboke.topic";
        String message = "hello badianboke.com";
        rabbitTemplate.convertAndSend(exchangeName, "chian.badian", message);
    }
}

2.在消费者consumer服务中监听两个队列并接收消息

cn/badianboke/mq/listener/SpringRabbitListener.java

package cn.badianboke.mq.listener;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.time.LocalTime;

@Component
public class SpringRabbitListener {

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1"),
            exchange = @Exchange(name = "badianboke.topic",  type = ExchangeTypes.TOPIC),
            key = {"red", "blue"}
    ))
    public void listenTopicQueue1(String message){
        System.err.println("Consumer1 Received topic.queue1 Message: " + message + " / " + LocalTime.now());
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "badianboke.topic",  type = ExchangeTypes.TOPIC),
            key = {"red", "yellow"}
    ))
    public void listenTopicQueue2(String message){
        System.err.println("Consumer2 Received direct.queue2 Message: " + message + " / " + LocalTime.now());
    }
}

打开RabbitMq控制台,可以看到

一个交换机badianboke.direct

两个队列direct.queue1direct.queue2

绑定关系

3.运行服务可以看到消费者接收到消息