Rabbimq的基本使用(Java版本)

1、使用docker安装

docker run -d --name rabbitmq_15672_5672 \
-v rabbitmq:/var/lib/rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:management

2、生产者代码

public class Consumer {
    public static void main(String[] args) throws Exception {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置参数
        factory.setHost("123.57.144.143");
        factory.setPort(5672);
        //账号密码
        factory.setUsername("admin");
        factory.setPassword("admin");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();

        /*
         * 消费消息
         * 1、消费哪个队列的消息
         * 2、消费成功后是否自动取消应答,true:自动取消,false:手动取消
         * 3、接收消息的回调函数
         * 4、取消消息的回调函数
         */
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("接收的消息为:"+new String(message.getBody()));
        };

        CancelCallback cancelCallback = (consumerTag) ->{
            System.out.println("消息被中断!");
        };

        channel.basicConsume("dz_queue_test",true,deliverCallback,cancelCallback);
    }
}

3、消费者代码

public class Consumer {
    public static void main(String[] args) throws Exception {
        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置参数
        factory.setHost("123.57.144.143");
        factory.setPort(5672);
        //账号密码
        factory.setUsername("admin");
        factory.setPassword("admin");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();

        /*
         * 消费消息
         * 1、消费哪个队列的消息
         * 2、消费成功后是否自动取消应答,true:自动取消,false:手动取消
         * 3、接收消息的回调函数
         * 4、取消消息的回调函数
         */
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println("接收的消息为:"+new String(message.getBody()));
        };

        CancelCallback cancelCallback = (consumerTag) ->{
            System.out.println("消息被中断!");
        };

        channel.basicConsume("dz_queue_test",true,deliverCallback,cancelCallback);
    }
}

4、交换机的配置

1、direct交换机
  • 生产者代码

    public class ProducerDirect {
        public static void main(String[] args) throws Exception {
            //交换机名称
            String exchangeName = "dz_exchange_test";
            //队列名称
            String queueName_1 = "dz_queue_test_1";
            String queueName_2 = "dz_queue_test_2";
            String queueName_3 = "dz_queue_test_3";
            String queueName_4 = "dz_queue_test_4";
            // 仅针对 DIRECT 交换机
            //发送消息的时候,通过路由键进行发送,而不是指定队列名称进行发送
            //拥有相同路由键的队列都会接收到由该路由键发送的消息,但是分别消费
            String key_1 = "key_1";
            String key_3 = "key_3";
            String key_4 = "key_4";
    
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            //设置参数
            factory.setHost("123.57.144.143");
            factory.setPort(5672);
            //账号密码
            factory.setUsername("admin");
            factory.setPassword("admin");
            //创建连接对象
            Connection connection = factory.newConnection();
            //创建信道
            Channel channel = connection.createChannel();
    
            /*
             * 创建交换机
             * 1、交换机的名称
             * 2、交换机类型,fanout、topic、direct、headers
             * 3、指定交换机是否需要持久化,true:需要持久化,false:不需要持久化
             * 4、指定交换机在没有队列绑定时是否需要删除,true:删除,false:不删除
             * 5、Map<String,Object> 类型,用来指定我们交换机的其他一些机构化参数,我们在这里直接设置为null
             */
            channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,null);
    
            /*
             * 生成一个队列
             * 1、队列名称
             * 2、队列是否需要持久化,但是要注意,这里的持久化只是对类名称等这元数据的持久化,不是队列中的消息的持久化
             * 3、表示队列是不是私有的,如果是私有的,只有创建它的应用才能消费消息
             * 4、队列在没有消费之订阅的情况下是否自动删除
             * 5、队列的一些机构化参数信息,比如,声明私信队列,磁盘队列会用到
             */
            channel.queueDeclare(queueName_1,true,false,false,null);
            channel.queueDeclare(queueName_2,true,false,false,null);
            channel.queueDeclare(queueName_3,true,false,false,null);
            channel.queueDeclare(queueName_4,true,false,false,null);
    
            /*
             * 将交换机和队列进行绑定
             * 1、队列名称
             * 2、交换机名称
             * 3、路由键,在直连模式下,路由键和队列名称是一致的
             */
            channel.queueBind(queueName_1,exchangeName,key_1);
            channel.queueBind(queueName_2,exchangeName,key_1);
            channel.queueBind(queueName_3,exchangeName,key_3);
            channel.queueBind(queueName_4,exchangeName,key_4);
    
            /*
             * 发送消息
             * 1、发送到那个交换机
             * 2、路由键名称
             * 3、其他的参数信息
             * 4、发送消息的消息体
             */
            channel.basicPublish(exchangeName,key_1,null,"key_1".getBytes());
            channel.basicPublish(exchangeName,key_3,null,"key_3".getBytes());
            channel.basicPublish(exchangeName,key_4,null,"key_4".getBytes());
    
            //关闭连接
            channel.close();
            connection.close();
        }
    }
    
2、fanout交换机
  • 原理图
image-20250224075647313
  • 生产者代码

    public class ProducerFanout {
        public static void main(String[] args) throws Exception {
            //交换机名称
            String exchangeName = "dz_exchange_test_fanout";
            //队列名称
            String queueName_1 = "dz_queue_test_Fanout_1";
            String queueName_2 = "dz_queue_test_Fanout_2";
            String queueName_3 = "dz_queue_test_Fanout_3";
            String queueName_4 = "dz_queue_test_Fanout_4";
            // Fanout 交换机,不论路由键是多少,都会将消息发送给所有绑定的队列
            // 这里演示设置不同的路由键
            String key_1 = "key_1";
            String key_3 = "key_3";
            String key_4 = "key_4";
    
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            //设置参数
            factory.setHost("123.57.144.143");
            factory.setPort(5672);
            //账号密码
            factory.setUsername("admin");
            factory.setPassword("admin");
            //创建连接对象
            Connection connection = factory.newConnection();
            //创建信道
            Channel channel = connection.createChannel();
    
            /*
             * 创建交换机
             * 1、交换机的名称
             * 2、交换机类型,fanout、topic、direct、headers
             * 3、指定交换机是否需要持久化,true:需要持久化,false:不需要持久化
             * 4、指定交换机在没有队列绑定时是否需要删除,true:删除,false:不删除
             * 5、Map<String,Object> 类型,用来指定我们交换机的其他一些机构化参数,我们在这里直接设置为null
             */
            channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true,false,null);
    
            /*
             * 生成一个队列
             * 1、队列名称
             * 2、队列是否需要持久化,但是要注意,这里的持久化只是对类名称等这元数据的持久化,不是队列中的消息的持久化
             * 3、表示队列是不是私有的,如果是私有的,只有创建它的应用才能消费消息
             * 4、队列在没有消费之订阅的情况下是否自动删除
             * 5、队列的一些机构化参数信息,比如,声明私信队列,磁盘队列会用到
             */
            channel.queueDeclare(queueName_1,true,false,false,null);
            channel.queueDeclare(queueName_2,true,false,false,null);
            channel.queueDeclare(queueName_3,true,false,false,null);
            channel.queueDeclare(queueName_4,true,false,false,null);
    
            /*
             * 将交换机和队列进行绑定
             * 1、队列名称
             * 2、交换机名称
             * 3、路由键,在直连模式下,路由键和队列名称是一致的
             */
            channel.queueBind(queueName_1,exchangeName,key_1);
            channel.queueBind(queueName_2,exchangeName,key_1);
            channel.queueBind(queueName_3,exchangeName,key_3);
            channel.queueBind(queueName_4,exchangeName,key_4);
    
            /*
             * 发送消息
             * 1、发送到那个交换机
             * 2、路由键名称
             * 3、其他的参数信息
             * 4、发送消息的消息体
             */
            // 这里只给一个队列发送消息,但是会被所有绑定的对类收到
            channel.basicPublish(exchangeName,key_1,null,"Fanout_key_1".getBytes());
    
            //关闭连接
            channel.close();
            connection.close();
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值