RabbitMQ基础知识

一、发送消息端

    /*
    * 创建队列,名字为myQueue
    * 参数1: 为队列名
    * 参数2: 是否为持久化的队列
    * 参数3: 是否排外,如果排外则这个队列只允许一个消费者监听.
    * 参数4: 是否自动删除队列,如果为ture则表示当队列中没有消息,也没有消费者连接时,就会自动删除这个队列
    * 参数5: 为队列的一些属性设置,通常为null即可.
    * */
    channel.queueDeclare("myQueue",true,false,false,null);
    /*
     * 发送消息到指定队列
     * 参数1: 为交换机名称,这里的空字符串表示不使用交换机
     * 参数2: 为队列名或RoutingKey,当指定了交换机名称后,这个值就是RoutingKey
     * 参数3: 消息的属性信息,通常为空即可
     * 参数4: 为具体的消息字节数组
     * */
    channel.basicPublish("","myQueue",null,message.getBytes("UTF-8"));

二、接受消息端

    /*
    * 接收消息
    * 参数1 队列名称
    * 参数2 是否自动确认消息 true表示自动确认 false表示手动确认
    * 参数3 为消息标签 用来区分不同的消费者这里暂时为""
    * 参数4 消费者回调方法用于编写处理消息的具体代码(例如打印或将消息写入数据库)
    * 注意:
    *   使用了basicConsume方法后,会启动一个线程在持续的监听队列,如果队列中有信息的数据
    *   进入则会自动接收消息,因此不能关闭连接和通道对象.
    * */
    channel.basicConsume("myQueue",autoAck,consumerTag,new DefaultConsumer(channel){
        public void handleDelivery(String consumerTag,
                                   Envelope envelope,
                                   AMQP.BasicProperties properties,
                                   byte[] body) throws IOException {
            //获取消息数据
            String bodyStr = new String(body, "UTF-8");
            System.out.println(bodyStr);
        }
    });
    //不注释掉就不会循环获取信息,只能获取一条
   /* channel.close();
    connection.close();*/

三、Direct类型
    发送消息端:

ConnectionFactory factory = new ConnectionFactory();

        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("root");
        factory.setPassword("root");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        String message ="夫英雄者,胸怀大志,腹有良策,有包藏宇宙只机,吞吐天地之志也!";
        String exchangeName="myExchange";

        channel.queueDeclare("myQueueDirect",true,false,false,null);


        /*
        * 指定Exchange的类型
        * 参数1: 交换机名称
        * 参数2: 交换机类型取值为 direct、queue、topic、headers
        * 参数3: 是否为持久化消息 true表示持久化消息 false表示非持久化
        * */
        channel.exchangeDeclare(exchangeName,"direct",true);

        //将交换机与队列进行绑定
        channel.queueBind("myQueueDirect",exchangeName,"myRoutingKey");

        /*
        * 发送消息到RabbitMQ
        * 参数1: 我们自定义的交换机名称
        * 参数2: 自定义的RoutingKey值
        * 参数3: 设置消息的属性,可以通过消息属性设置消息是否是持久化的
        * 参数4: 具体要发送的消息信息
        * */

        channel.basicPublish(exchangeName,"myRoutingKey",null,message.getBytes("UTF-8"));
        System.out.println("消息发送成功: "+message);

        channel.close();
        connection.close();

    接受消息端:

ConnectionFactory factory = new ConnectionFactory();

        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("root");
        factory.setPassword("root");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        //消费消息
        boolean autoAck = true;
        String consumerTag = "";

        String exchangeName="myExchange"; //声明交换机名称
        channel.exchangeDeclare(exchangeName,"direct",true);

        channel.queueDeclare("myQueueDirect",true,false,false,null);

        channel.queueBind("myQueueDirect",exchangeName,"myRoutingKey");

        channel.basicConsume("myQueueDirect",autoAck,consumerTag,new DefaultConsumer(channel){
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                //获取消息数据
                String bodyStr = new String(body, "UTF-8");
                System.out.println(bodyStr);
            }
        });
        //不注释掉就不会循环获取信息,只能获取一条
       /* channel.close();
        connection.close();*/

四、Fanout类型
    发送消息端:

ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("root");
        factory.setPassword("root");

        //创建连接对象和通道对象
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        String message = "问苍茫大地,谁主沉浮?";
        String exchangeName = "myExchangeFanout";

        //指定交换机名称和类型
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT,true);
        //String queueName = channel.queueDeclare().getQueue();
        //将交换机与队列进行绑定
        //channel.queueBind(queueName,exchangeName,"");

        channel.basicPublish(exchangeName,"",null,message.getBytes("UTF-8"));
        System.out.println("消息发送成功:"+message);
        channel.close();
        connection.close();

    接收消息端:

ConnectionFactory factory = new ConnectionFactory();

        factory.setPort(5672);
        factory.setHost("localhost");
        factory.setUsername("root");
        factory.setPassword("root");

        //创建连接对象和通道对象
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        //声明交换机
        String exchangeName="myExchangeFanout";
        channel.exchangeDeclare(exchangeName,BuiltinExchangeType.FANOUT,true);

        //获取一个临时队列
        String queueName = channel.queueDeclare().getQueue();

        //将交换机与队列绑定
        channel.queueBind(queueName,exchangeName,"");

        boolean autoAck = true;
        String consumerTag = "";
        //接收消息
        //参数1 队列名称
        //参数2 是否自动确认消息 true表示自动确认 false表示手动确认
        //参数3 为消息标签 用来区分不同的消费者这列暂时为""
        // 参数4 消费者回调方法用于编写处理消息的具体代码(例如打印或将消息写入数据库)
        System.out.println(queueName);
        channel.basicConsume(queueName,autoAck,consumerTag,new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                //获取消息数
                String bodyStr = new String(body, "UTF-8");
                System.out.println(bodyStr);
            }
        });
       /* channel.close();
        connection.close();*/
注意:
1、使用fanout模式获取消息时不需要绑定特定的队列名称,只需使用channel.queueDeclare().getQueue();获取一个随机的队列名称,然后绑定到指定的Exchange即可获取消息。
2、这种模式中可以同时启动多个接收者只要都绑定到同一个Exchang即可让所有接收者同时接收同一个消息是一种广播的消息机制    

五、Topic类型
    发送消息端:

ConnectionFactory factory = new ConnectionFactory();

        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("root");
        factory.setPassword("root");

        //创建连接对象和通道对象
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        //String message = "驰来北马多骄气,歌到南风竟死声!";
        String message = "人间别久不成悲,谁叫岁岁红莲月,两处沉吟各自知!";
        String exchangeName = "myExchangeTopic";
        //指定交换机类型,是否持久化
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true);

        /*
        * 发送消息到RabbitMQ
        * 参数1: 自定义的交换机名称
        * 参数2: 自定义的RoutingKey值
        * 参数3: 设置消息的属性,可以通过消息属性设置消息是否是持久化的
        * 参数4: 具体要发送的消息信息
        * 注意:
        *    在topic模式中必须要指定Routingkey,并且可以同时指定多层的RoutingKey.
        *    每个层次之间使用.点分隔即可. 例如: test.myRoutingKey
        * */
        channel.basicPublish(exchangeName,"test.myRoutingKey",null,message.getBytes("UTF-8"));
        System.out.println("消息发送成功: "+message);
        channel.close();
        connection.close();

    接受消息端:

ConnectionFactory factory = new ConnectionFactory();

        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("root");
        factory.setPassword("root");

        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        //声明交换机
        String exchangeName = "myExchangeTopic";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true);

        //声明队列
        String queueName = channel.queueDeclare().getQueue();
        String routingKey = "test.#";

        //绑定队列,通过键将队列和交换器绑定起来
        channel.queueBind(queueName, exchangeName, routingKey);

        /*
        * 注意:
        *   Topic模式的消息接收时必须要指定RoutingKey并且可以使用#和*来做统配符号,#表示通配
        *   任意一个单词,*表示通配任意多个单词.
        *
        *   例如消费者的RoutingKey为test.#或#.myRoutingKey,都可以获取
        *   RoutingKey为test.myRoutingKey发送者发送的消息.
        * */
        channel.basicConsume(queueName,true,"",new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body) throws IOException {
                //获取消息数
                String bodyStr = new String(body, "UTF-8");
                System.out.println(bodyStr);
            }
        });
       /* channel.close();
        connection.close();*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值