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

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

本文讲解DirectExchange
直连型交换机,根据消息携带的路由键将消息投递给对应队列。
大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。

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

交换机名称是badianboke.direct

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.direct";
        String message = "hello badianboke.com";
        rabbitTemplate.convertAndSend(exchangeName, "red", 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.direct"),
            key = {"red", "blue"}
    ))
    public void listenDirectQueue1(String message){
        System.err.println("Consumer1 Received direct.queue1 Message: " + message + " / " + LocalTime.now());
    }

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

打开RabbitMq控制台,可以看到

一个交换机badianboke.direct

两个队列direct.queue1direct.queue2

绑定关系

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

绑定blue的时候,只能看到direct.queue1消费

绑定red的时候,能看到两个队列都消费了