RabbitMQ-广播模式
概述
fanout扇出也称之为广播
在广播模式下,消息发送的流程是这样的,如下所示:
- 可以有多个消费者。
- 每个消费者有自己的 queue(队列)
- 每个队列都要绑定到 Exchange(交换机)
- 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
- 交换机把消息发送给绑定过的所有队列。
- 队列的消费者都能拿到消息。实现一条消息被多个消费者消费。
创建生产者
/**
* @author: BNTang
*/
public class Producer {
@Test
public void sendMessage() throws Exception {
Connection connection = RabbitMQUtil.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 设置交换机
channel.exchangeDeclare("logs", BuiltinExchangeType.FANOUT);
// 向交换机发消息
channel.basicPublish("logs", "", null, ("我是个 fanout 类型的消息").getBytes());
RabbitMQUtil.closeChannelAndConnection(channel, connection);
System.out.println("消息发送成功");
}
}
创建消费者 1
/**
* @author BNTang
*/
public class Consumer1 {
@Test
public void receiveMessage() throws Exception {
Connection connection = RabbitMQUtil.getConnection();
// 得到通道
Channel channel = connection.createChannel();
// 绑定交换机
channel.exchangeDeclare("logs", BuiltinExchangeType.FANOUT);
// 从通道里面得到一个临时的队列
String queue = channel.queueDeclare().getQueue();
// 把临时队列和交换机进行绑定
channel.queueBind(queue, "logs", "");
// 接收消息
channel.basicConsume(queue, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者【1】接收到消息" + new String(body));
}
});
System.out.println("消费者【1】启动成功");
System.in.read();
}
}
创建消费者 2
/**
* @author BNTang
*/
public class Consumer2 {
@Test
public void receiveMessage() throws Exception {
Connection connection = RabbitMQUtil.getConnection();
// 得到通道
Channel channel = connection.createChannel();
// 绑定交换机
channel.exchangeDeclare("logs", BuiltinExchangeType.FANOUT);
// 从通道里面得到一个临时队列
String queue = channel.queueDeclare().getQueue();
// 把临时的队列和交换机进行绑定
channel.queueBind(queue, "logs", "");
// 接收消息
channel.basicConsume(queue, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者【2】接收到消息" + new String(body));
}
});
System.out.println("消费者【2】启动成功");
System.in.read();
}
}
测试方式,先启动消费者1,和消费者2,在启动消息生产者即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具