zoukankan      html  css  js  c++  java
  • RabbitMQ ——简单队列

    一 .概述  

      我们不从开始就讲述基本的概念,尤其是在Rabbitmq之中有些概念确实比较难以理解,我们首先做的就是将光放提供的消息模型

      进行实现,然后再总结一下Rabbitmq之中的基本概念.


    二 .基础的工具类

      我们想使用Rabbitmq,那么首先需要的就是一个连接,本部分我们首先就说一下获取连接的方式.

      我们首先搭建我们的测试环境,首先需要做的就是添加我们的依赖包. 

            <dependency>
                <groupId>com.rabbitmq</groupId>
                <artifactId>amqp-client</artifactId>
                <version>5.4.0</version>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>1.1.3</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.25</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.25</version>
            </dependency>

    然后我们需要做的就是编写我们的连接工具类.

      通过下面的代码,我们知道我们这个仅仅只是一个我们测试环境下的一个工具类,很多东西都是方便我们使用的而已.

    public class ConnectionUtils {
        
        public static Connection getConnection() throws Exception {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("127.0.0.1");
            factory.setPort(5672);
            factory.setUsername("admin");
            factory.setPassword("123456");
            return factory.newConnection();
        }
    }

    在Rabbimtq之中,获取连接的方式时比较容易的.主要分成下面的三个部分:

    [1]创建连接工厂

    [2]为连接工厂设置属性

    [3]从连接工厂之中获取连接.


    三,简单队列

      

    上面的图中表示的就是简单队列的模型.

    其中:P表示的就是消息的生产者,红色的部分表示的就是消息队列,C表示的就是消息的消费者.

    上面的模型是十分的简单的,这也是我们首次使用Rabbitmq的最好的一个模型.

    看下面最简单的代码:  

    public class Send {
        
        public static void main(String[] args) throws Exception{
            
            // 获取一个连接对象
            Connection connection = ConnectionUtils.getConnection();
            //从连接之中获取一个Channel对象
            Channel channel = connection.createChannel();
            // 队列的名称
            String queueName = "simple_queue";
            // 声明一个队列
            channel.queueDeclare(queueName, false, false, false, null);
            
            // 然后向队列之中发送消息
            channel.basicPublish("", queueName, null, "trek".getBytes());
            
            //关闭资源
            channel.close();
            connection.close();
            
        }
    }

    当我们发送了一条消息之后,我们到admin之中看看情况.

     

    我们从admin之中看到我们确实成功的发送了一条消息.

    然后下面我们需要编写我们的消费端的内容.

    public class Resv {
    
        public static void main(String[] args) throws Exception {
            Connection connection = ConnectionUtils.getConnection();
    
            Channel channel = connection.createChannel();
            
            // 创建一个消费者
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                        byte[] body) throws IOException {
                    System.out.println("消费者获取到的消息是=="+new String(body));
                }
            };
            
            channel.basicConsume("simple_queue",true, consumer); // 注意这个参数true,如果我们设置为false,我们就需要手动确认消息的消费,否则这一条消息无法在中间件之中清除掉.
            
        }
    }

    现在我们看看我们的admin之中的内容,我们发现现在在admin之中的内容如下:

      

    从生产者之中发送的消息确实被消费掉了.


    四,示例解释

    • 关于用户名和密码:用户名和密码可以在RabbitMQ Management平台上的Admin菜单下创建,也可以通过rabbitmqctl命令行来创建
    • 关于队列声明queueDeclare的参数:第一个参数表示队列名称、第二个参数为是否持久化(true表示是,队列将在服务器重启时生存)、第三个参数为是否是独占队列(创建者可以使用的私有队列,断开后自动删除)、第四个参数为当所有消费者客户端连接断开时是否自动删除队列、第五个参数为队列的其他参数
    • 关于basicConsume的第二个参数autoAck: 应答模式,true:自动应答,即消费者获取到消息,该消息就会从队列中删除掉,false:手动应答,当从队列中取出消息后,需要程序员手动调用方法应答,如果没有应答,该消息还会再放进队列中,就会出现该消息一直没有被消费掉的现象
    • 系统会为每个队列都隐式的绑定一个默认的交换机,交换机的名称为“(AMQP default)”,类型为直连接direct,当你手动创建一个队列时,后台会自动将这个队列绑定到一个名称为空的Direct类型交换机上,绑定路由名称与队列名称相同,相当于channel.queueBind(queue:”QUEUE_NAME”, exchange:”(AMQP default)”, routingKey:”QUEUE_NAME”); 所以示例虽然没有显示声明交换机,当路由键和队列名称一样时就将消息发送到这个默认的交换机里。有了这个默认的交换机和绑定,我们就可以像其他轻量级的队列,如Redis那样,直接操作队列来处理消息。不过理论上是可以的,但实际上在RabbitMQ里直接操作是不可取的。消息始终都是先发送到交换机,由交换级经过路由传送给队列,消费者再从队列中获取消息的。不过由于这个默认交换机和路由的关系,使我们只关心队列这一层即可,这个比较适合做一些简单的应用,毕竟没有发挥RabbitMQ的最大功能(RabbitMQ可以重量级消息队列),如果都用这种方式去使用的话就真是杀鸡用宰牛刀了。

    The default exchange is implicitly bound to every queue, with a routing key equal to the queue name. It is not possible to explicitly bind to, or unbind from the default exchange. It also cannot be deleted.默认交换机隐式绑定到每个队列,其中路由键等于队列名称。不可能显式绑定到,或从缺省交换中解除绑定。它也不能被删除。
     

  • 相关阅读:
    一句话搞定qt4 开发环境
    一句话随笔.....
    es6学习笔记(二)
    Vue学习笔记(一)
    es6学习笔记(一)
    Java中的一些基础概念
    你了解Java中String的substring函数吗?
    Ajax请求与浏览器缓存
    QCon杭州2012技术开发大会感受
    为什么选择使用Sass而不是Less?
  • 原文地址:https://www.cnblogs.com/gmhappy/p/11864034.html
Copyright © 2011-2022 走看看