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,在启动消息生产者即可。

posted @   BNTang  阅读(4061)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示