08-RabbitMQ-广播模式

概述

fanout扇出也称之为广播

在广播模式下,消息发送的流程是这样的,如下所示:

  • 可以有多个消费者。
  • 每个消费者有自己的 queue(队列)
  • 每个队列都要绑定到 Exchange(交换机)
  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
  • 交换机把消息发送给绑定过的所有队列。
  • 队列的消费者都能拿到消息。实现一条消息被多个消费者消费。

创建生产者

java
/**
 * @author: BNZeng
 */
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

java
/**
 * @author BNZeng
 */
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

java
/**
 * @author BNZeng
 */
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();
    }
}
posted @ 2022-04-28 22:14  鱼檬檬  阅读(328)  评论(0编辑  收藏  举报