RabbitMQ发布订阅模式

流程示例

在这里插入图片描述

特点

1.一个生产者
2.多个消费者
3.多个队列。
4.交换机 转发消息。

X代表交换机rabbitMQ内部组件,erlang 消息产生者是代码完成,代码的执行效率不高,消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费
相关场景:邮件群发,群聊天,广播(广告)

保证所有消费者都可以拿到信息

代码实例

生产者:


    
    import com.rabbitmq.client.BuiltinExchangeType;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;

    public class Product {
        public static void main(String[] args)throws  Exception {
            //创建连接工厂 --配置连接信息
            ConnectionFactory factory=new ConnectionFactory();
            factory.setHost("IP地址");
            //创建连接对象Connection
            Connection connection=factory.newConnection();
            //创建信道
            Channel channel = connection.createChannel();
    
            //创建队列
            /**
             * String queue, 队列的名称
             * boolean durable, 是否该队列持久化 rabbitMQ服务重启后该存放是否存在。
             * boolean exclusive, 是否独占 false
             * boolean autoDelete, 是否自动删除  如果长时间没有发生消息 则自动删除
             * Map<String, Object> arguments 额外参数  先给null
             */
            channel.queueDeclare("队列1",true,false,false,null);
            channel.queueDeclare("队列2",true,false,false,null);
    
            //创建交换机
            /**
             * String exchange,交换机的名称
             * BuiltinExchangeType type, 交换机的类型
             * boolean durable:是否持久化
             */
            channel.exchangeDeclare("交换机", BuiltinExchangeType.FANOUT,true);
            /**
             * String queue,  队列名
             * String exchange, 交换机的名称
             * String routingKey:路由key 如果交换机为fanout模式则不需要路由key
             */
            channel.queueBind("队列1","交换机","");
            channel.queueBind("队列2","交换机","");
            //发生消息
            /**
             * String exchange: 交换机的名称 如果没有则使用“” 它回自动采用默认
             * String routingKey, 路由key  如果没有交换机的绑定 使用队列的名称
             * BasicProperties props, 消息的一些额外配置 目前先不加 null
             * byte[] body 消息的内容
             */
            for(int i=0;i<10;i++) {
                String msg = "所有消费者都可以拿到信息"+i;
                channel.basicPublish("绑定交换机", "", null, msg.getBytes());
            }
            //生产者这里可以管理资源  消费者不能关闭资源。
            channel.close();
            connection.close();
    
        }
    }
    

消费者:

    
    import java.io.IOException;

    public class Consumer01 {
        public static void main(String[] args) throws Exception{
            //创建连接工厂 --配置连接信息
            ConnectionFactory factory=new ConnectionFactory();
            factory.setHost("IP地址");
            //创建连接对象Connection
            Connection connection=factory.newConnection();
            //创建信道
            Channel channel = connection.createChannel();
    
            //接受消息
            /**
             * (String queue, 队列的名称
             *  boolean autoAck, 是否自动确认
             *  Consumer callback: 回调方法 当队列中存在信息后 会自动触发回调函数。
             */
            DefaultConsumer callback=new DefaultConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    //body 接受的信息
                    try {
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("消费者:"+new String(body));
                }
            };
            channel.basicConsume("队列",true,callback);
    
        }
          }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值