fanout(扇出模型)

2024-01-01 17:32:44

在广播的流程下,消息发送的流程如下:

  • 可以有多个消费者。

  • 每个消费者有自己的queue(队列)。

  • 每个队列都要绑定到Exchange(交换机)。

  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者也无法决定。

  • 交换机把消息发送给绑定过的所有队列

  • 所有的消费者都能拿到消息,实现一个消息被多个消费者消费

1.生产者

public class Provider {
    public static void main(String[] args) throws IOException {
        Connection connection = RabbitMqUtil.getConnection();
        Channel channel = connection.createChannel();
        //将通道声明指定交换机 参数1:指明交换机名称  参数2:交换机的类型 fanout广播类型
        channel.exchangeDeclare("fanoutexchange","fanout");
        //发送消息
        channel.basicPublish("fanoutexchange","",null,"hello fanout exchange".getBytes());
        //释放资源
        RabbitMqUtil.closeConnectionAndChannel(channel,connection);
    }
}

2.消费者

public class Consumer1 {
    public static void main(String[] args) throws IOException {
        //获取连接对象
        Connection connection = RabbitMqUtil.getConnection();
        //获取连接通道
        Channel channel = connection.createChannel();
        //通道绑定交换机
        channel.exchangeDeclare("fanoutexchange","fanout");
        //临时队列
        String queueName = channel.queueDeclare().getQueue();
        //绑定交换机和队列
        channel.queueBind(queueName,"fanoutexchange","");
        channel.basicConsume(queueName,true,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumer1得到:"+new String(body));
            }
        });
        //注意这里不能关闭通道和连接,因为要一直监听
    }
}

3.结果分析

????????扇出模型,我们发现生产者生产一个消息,通过扇出传播三个消费者都能获取到消息。

文章来源:https://blog.csdn.net/m0_62565675/article/details/135326281
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。