RabbitMQ第3种消息模型:fanout【广播模式】

广播模式的特点

  • 可以多个消费者
  • 每个消费者都有自己的队列queue【排他队列、独占队列】,保证了一条消息能被多个消费者消费
  • 每个队列绑定到交换机exchange
  • 生产者生产的消息,只能发送到交换机,由交换机决定发送给哪个队列,生产者无法决定
  • 交换机把消息发送给绑定到该交换机的所有队列
  • 队列的消费者都能拿到消息,实现一条消息被多个消费者消费
    RabbitMQ第3种消息模型:fanout【广播模式】_第1张图片

获取连接的工具类

public class RabbitMQUtil {

    private static ConnectionFactory connectionFactory;
    static {
        //创建连接工厂
        connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务器所在主机ip
        connectionFactory.setHost("www.onething.top");
        //设置端口号
        connectionFactory.setPort(5672);
        //设置虚拟主机
        connectionFactory.setVirtualHost("/");
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("123456");
    }

    public static Connection getConnection() {

        //创建连接对象
        try {
            return connectionFactory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void closeConnectionAndChannel(Channel channel, Connection connection) {
        try {
            if(channel!=null){
                channel.close();
            }
            if(connection!=null){
                connection.close();
            }
        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
        }
    }
}

创建消息生产者

public static void main(String[] args) throws IOException {
        Connection connection = RabbitMQUtil.getConnection();
        Channel channel = connection.createChannel();
        /**
         * 参数1:交换机名称
         * 参数2:交换机类型
         * 参数3:是否持久化交换机
         */
        channel.exchangeDeclare("fanout-exchange", "fanout", true);
        /**
         * 参数1:自定义的交换机名称
         * 参数2:Fanout消息模型,路由键不起作用,因此用空字符串代替
         * 参数3:
         * 参数4:要发送的消息
         */
        channel.basicPublish("order-exchange", "", null, "广播模式测试".getBytes());
        RabbitMQUtil.closeConnectionAndChannel(channel, connection);
    }

创建消息消费者

public class ConsumerA {
    public static void main(String[] args) throws IOException {
        Connection connection = RabbitMQUtil.getConnection();
        Channel channel = connection.createChannel();
        //定义通道对应的交换机
        channel.exchangeDeclare("news-exchange", "fanout", true);
        //获取临时队列
        String queueName = channel.queueDeclare().getQueue();
        System.out.println(queueName);
        //将临时队列和交互机绑定,广播模式路由键不起作用
        channel.queueBind(queueName, "news-exchange", "");

        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("消费者A:"+new String(body));
            }
        });
    }
}

按上面的方式创建A、B、C三个生产者,运行结果如下:
RabbitMQ第3种消息模型:fanout【广播模式】_第2张图片

你可能感兴趣的:(消息队列MQ)