直连交换机
上一篇博客中讲解了扇形交换机,但是由于扇形交换机属于广播类型的交换机,如果我们需要一对一这种类型的发送接收消息,使用扇形交换机就不太合适,可以使用直连交换机。
直连交换机
直连交换机生产者代码
public class DirectLogs {
//交换机的名称
public static final String EXCHANGE_NAME = "direct_logs";
public static void main(String[] args) throws Exception {
Channel channel = RabbitMqUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
channel.basicPublish(EXCHANGE_NAME, "info", null, message.getBytes("UTF-8"));
System.out.println("生产者发出消息:" + message);
}
}
}
消费者代码
public static final String EXCHANGE_NAME = "direct_logs";
public static void main(String[] args) throws Exception {
Channel channel = RabbitMqUtils.getChannel();
//声明一个交换机
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
//声明一个队列 临时队列
/*
生成一个临时的队列,队列的名称是随机的
当消费者断开与队列的连接到时候 队列就自动删除
*/
channel.queueDeclare("console", false, false, false, null);
/*
绑定交换机与队列
此处的routingKey为info,所以生产者中发过来的消息,该消费者可以接收到
*/
channel.queueBind("console", EXCHANGE_NAME, "info");
channel.queueBind("console", EXCHANGE_NAME, "warning");
System.out.println("等待接收消息,把接收到的消息打印在屏幕上");
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("01控制台接收到消息:" + new String(message.getBody(), "UTF-8"));
};
CancelCallback cancelCallback = (consumerTag) -> {
};
channel.basicConsume("console", true, deliverCallback, cancelCallback);
}
}
显示效果图:
生产者发送消息效果图:
消费者消费消息效果图如下:
总结:direct交换机当多个不同队列绑定相同的routingkey时,其实功能上等价于扇形交换机。
所以可以理解为扇形交换机是特殊的直连交换机。