rabbitmq基础-java-5、Topic交换机

1、简介

Topic类型的ExchangeDirect相比,都是可以根据RoutingKey把消息路由到不同的队列。 只不过Topic类型Exchange可以让队列在绑定BindingKey 的时候使用通配符!

BindingKey 一般都是有一个或多个单词组成,多个单词之间以.分割,例如: item.insert

通配符规则:

  • #:匹配一个或多个词

  • *:匹配不多不少恰好1个词

举例:

  • item.#:能够匹配item.spu.insert 或者 item.spu

  • item.*:只能匹配item.spu

图示:

rabbitmq基础-java-5、Topic交换机_第1张图片

假如此时publisher发送的消息使用的RoutingKey共有四种:

  • china.news代表有中国的新闻消息;

  • china.weather 代表中国的天气消息;

  • japan.news 则代表日本新闻

  • japan.weather 代表日本的天气消息;

解释:

  • topic.queue1:绑定的是china.# ,凡是以 china.开头的routing key 都会被匹配到,包括:

    • china.news

    • china.weather

  • topic.queue2:绑定的是#.news ,凡是以 .news结尾的 routing key 都会被匹配。包括:

    • china.news

    • japan.news

接下来,我们就按照上图所示,来演示一下Topic交换机的用法。 首先,在控制台按照图示例子创建队列、交换机,并利用通配符绑定队列和交换机。

2、设置队列

rabbitmq基础-java-5、Topic交换机_第2张图片

3、设置交换机

rabbitmq基础-java-5、Topic交换机_第3张图片

4、绑定队列

rabbitmq基础-java-5、Topic交换机_第4张图片

5、设置生产者

    @Test
    void testSendTopic1() {
        String exchangeName = "test.topic";
        String msg = "china.good,今天天气真不错哦!!!";
        rabbitTemplate.convertAndSend(exchangeName, "china.good", msg);
    }
    @Test
    void testSendTopic2() {
        String exchangeName = "test.topic";
        String msg = "123.news,今天天气真不错哦!!!";
        rabbitTemplate.convertAndSend(exchangeName, "123.news", msg);
    }
    @Test
    void testSendTopic3() {
        String exchangeName = "test.topic";
        String msg = "china.news,今天天气真不错哦!!!";
        rabbitTemplate.convertAndSend(exchangeName, "china.news", msg);
    }

6、设置消费者

    @RabbitListener(queues = "topic.queue1")
    public void listenTopicQueue1(String msg) throws InterruptedException {
        System.out.println("消费者1 收到了 topic.queue1的消息:【" + msg +"】");
    }

    @RabbitListener(queues = "topic.queue2")
    public void listenTopicQueue2(String msg) throws InterruptedException {
        System.out.println("消费者2 收到了 topic.queue2的消息:【" + msg +"】");
    }

7、测试

rabbitmq基础-java-5、Topic交换机_第5张图片

 rabbitmq基础-java-5、Topic交换机_第6张图片

rabbitmq基础-java-5、Topic交换机_第7张图片

8、总结

Direct交换机与Topic交换机的差异?

  • Topic交换机接收的消息RoutingKey必须是多个单词,以 **.** 分割

  • Topic交换机与队列绑定时的bindingKey可以指定通配符

  • #:代表0个或多个词

  • *:代表1个词

你可能感兴趣的:(消息队列-rabbitmq,rabbitmq,分布式)