direct 直接交换机

This commit is contained in:
2021-12-01 10:29:15 +08:00
parent a74627da58
commit 96c71755ed
5 changed files with 119 additions and 0 deletions

View File

@@ -50,3 +50,5 @@ binding 其实是 exchange 和 queue 之间的桥梁,它告诉我们 exchang
Logs 和临时队列的绑定关系如下图 Logs 和临时队列的绑定关系如下图
<img alt="uDo2IqbMv3jF1CH" src="https://vip1.loli.io/2021/11/30/uDo2IqbMv3jF1CH.png" width="300"/> <img alt="uDo2IqbMv3jF1CH" src="https://vip1.loli.io/2021/11/30/uDo2IqbMv3jF1CH.png" width="300"/>

View File

@@ -0,0 +1,25 @@
package io.jiulinxiri.rabbitmq.six;
import com.rabbitmq.client.Channel;
import io.jiulinxiri.rabbitmq.utils.RabbitMqUtils;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/**
* 生产者
*/
public class DirectLogs {
public static final String EXCHANGE_NAME = "direct_logs";
public static void main(String[] args) throws Exception {
Channel channel = RabbitMqUtils.getChannel();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
channel.basicPublish(EXCHANGE_NAME, "error", null, message.getBytes(StandardCharsets.UTF_8));
System.out.println("生产者发送消息: " + message);
}
}
}

View File

@@ -0,0 +1,33 @@
---
gitea: none
include_toc: true
---
### direct 直接交换机
#### Direct exchange 介绍
Direct exchange类型的工作方式是**消息只去到它绑定的 routingKey 队列中去**。
<img alt="5OkBSxQI7ecwEFP" src="https://vip2.loli.io/2021/12/01/5OkBSxQI7ecwEFP.png" width="400"/>
在上面这张图中,我们可以看到 X 绑定了两个队列,绑定类型是 direct。队列 Q1 绑定键为 orange
队列 Q2 绑定键有两个:一个绑定键为 black另一个绑定键为 green.
在这种绑定情况下,生产者发布消息到 exchange 上,绑定键为 orange 的消息会被发布到队列
Q1。绑定键为 blackgreen 和的消息会被发布到队列 Q2其他消息类型的消息将被丢弃。
#### 多重绑定
<img alt="jiulinxiri_20211201092706.png" src="https://vip1.loli.io/2021/12/01/ZxNSRMlH4aOqne6.png" width="400"/>
当然如果 exchange 的绑定类型是 direct但是它绑定的多个队列的 key 如果都相同,在这种情
况下虽然绑定类型是 direct 但是它表现的就和 fanout 有点类似了
#### 实战
<img alt="D6nCZhpf8wAul1P" src="https://vip2.loli.io/2021/12/01/D6nCZhpf8wAul1P.png" width="400"/>
交换机与队列的绑定关系图
<img alt="D6nCZhpf8wAul1P" src="https://vip1.loli.io/2021/12/01/aKdecn42hiZNjv9.png" width="400"/>

View File

@@ -0,0 +1,30 @@
package io.jiulinxiri.rabbitmq.six;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import io.jiulinxiri.rabbitmq.utils.RabbitMqUtils;
import java.nio.charset.StandardCharsets;
public class ReceiveLogsDirect01 {
private 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);
// 交换机与队列的绑定
channel.queueBind("console", EXCHANGE_NAME, "info");
channel.queueBind("console", EXCHANGE_NAME, "warning");
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("ReceiveLogsDirect01 控制台打印接收到的消息: " + new String(message.getBody(), StandardCharsets.UTF_8));
};
// 消息的消费
channel.basicConsume("console", true, deliverCallback, consumerTag -> {});
}
}

View File

@@ -0,0 +1,29 @@
package io.jiulinxiri.rabbitmq.six;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import io.jiulinxiri.rabbitmq.utils.RabbitMqUtils;
import java.nio.charset.StandardCharsets;
public class ReceiveLogsDirect02 {
private 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("disk", false, false, false, null);
// 交换机与队列的绑定
channel.queueBind("disk", EXCHANGE_NAME, "error");
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("ReceiveLogsDirect02 控制台打印接收到的消息: " + new String(message.getBody(), StandardCharsets.UTF_8));
};
// 消息的消费
channel.basicConsume("disk", true, deliverCallback, consumerTag -> {});
}
}