Success

  • 自述
  • 简单队列
  • 简单队列模型分解

  • Java环境
  • 生产者
  • RabbitMQ客户端查看队列数据
  • 消费者
  • 总结
  • Ending


自述

   此篇就开始进入RabbitMQ的实战了,RabbitMQ有6种场景,我会分为6个章节一一描述,本章节描述第一个场景------简单队列。

python rabbitmq 队列用完就删除吗 rabbitmq队列down_java

简单队列

   队列是RabbitMQ中邮箱的名称,虽然消息可以通过RabbitMQ和应用程序传递,但它们只能存储在队列中,队列只受主机内存磁盘的限制,它本质上是一个大型消息缓冲区。RabbitMQ是一个消息代理,它可以接收和转发消息,RabbitMQ类似于邮局,我们将想要邮寄的东西放到邮局,邮局再将我们邮寄的东西送到收件人那里,但它和邮局的区别在于,它不会处理接收的数据,而只是进行存储,存储二进制数据。

python rabbitmq 队列用完就删除吗 rabbitmq队列down_数据_02

简单队列模型分解

   生产者无非就是发送,发送消息的程序就是生产者:

                                       

python rabbitmq 队列用完就删除吗 rabbitmq队列down_队列_03


   队列是RabbitMQ中邮箱的名称,队列只受主机内存磁盘的限制,它本质上是一个大型消息缓冲区:

                                 

python rabbitmq 队列用完就删除吗 rabbitmq队列down_队列_04


   消费者与接收具有相似的含义,一个消费者是一个程序,主要是等待接收数据:

                                       

python rabbitmq 队列用完就删除吗 rabbitmq队列down_java_05


   生产者或消费者不必非要在一个主机上,应用程序既可以是生产者,也可以是消费者。

Java环境

   一、首先将RabbitMQ客户端进行启动,启动教程和下载教程于消息队列----RabbitMQ的学习(一)
   二、导入Pom.xml依赖。

<dependencies>
        <!--amqp协议-->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.5.3</version>
        </dependency>
        <!--slf4j api-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>
        <!--slf4j simple-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.26</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

生产者

   发送消息的程序则为生产者,那么下面我们将构建生产者进行发送数据于队列中。

                         

python rabbitmq 队列用完就删除吗 rabbitmq队列down_队列_06


 Send.java

/**
 * 简单的队列----producing---生产者
 * 1.RabbitMQ的核心就是基于通道(Channel)进行开展的
 * 2.通道的概念非常常见,例如:NIO的三大核心其中有一项就是通道
 */
public class Send {
    private static final String QUEUE_NAME = "yunkai_queue"; //队列名称

    public static void main(String[] args) {
        try {
            //获取RabbitMQ连接
            Connection connection = ConnectionUtil.getConnection();
            //获取管道
            Channel channel = connection.createChannel();
            /**
             * 创建队列
             * paramone:队列名称
             * 其余参数后续场景会依次开启
             */
               channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            /**
             * channel.basicPublish() --- 进行发送消息
             * paramtwo:队列名称
             * paramfour:存储的数据(字节形式)
             * 可通过循环发送信息到队列中
             */
            for (int i = 0; i < 1; i++) {
                String msg = "Hell Word,this is queue" + (i + 1);
                channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
            }
            //消息发送成功
            System.out.println("===send msg success===");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 ConnectionUtil.java

/**
 * Rabbitmq的工具类
 * methodone:连接
 * methodtwo关闭链接
 */
public class ConnectionUtil {

    private static final String HOST = "127.0.0.1"; //访问地址
    private static final String USER_NAME = "guest"; //用户名
    private static final String PWD = "guest"; //密码
    private static final String VIRTUAL_HOST = "/"; //虚拟主机
    private static final Integer PORT = 5672;    //amqp协议端口

    /**
     * 获取连接对象
     *
     * @return
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {
        ConnectionFactory factory = new ConnectionFactory(); //Rabbitmq连接工厂
        factory.setHost(HOST); //主机
        factory.setUsername(USER_NAME); //用户名
        factory.setPassword(PWD); //pwd
        factory.setVirtualHost(VIRTUAL_HOST);
        factory.setPort(PORT);
        return factory.newConnection();
    }

    /**
     * 关闭连接
     *
     * @param con
     * @param channel
     */
    public static void closeConnection(Connection con, Channel channel) {
        try {
            if (channel != null)
                channel.close();
            if (con != null)
                con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

   以上代码都完成之后,运行Send类的main()方法,将生产数据并发送到到队列中。

python rabbitmq 队列用完就删除吗 rabbitmq队列down_客户端_07

RabbitMQ客户端查看队列数据

   生产者生产数据成功之后可以通过RabbitMQ客户端查看队列的消息。

python rabbitmq 队列用完就删除吗 rabbitmq队列down_java_08


python rabbitmq 队列用完就删除吗 rabbitmq队列down_java_09


   当点击Get Message按钮的时候,队列的消息会以列表的方式呈现出来。

python rabbitmq 队列用完就删除吗 rabbitmq队列down_java_10

消费者

   与生产者不同,消费者监听RabbitMQ消息并获取RabbitMQ消息。

                         

python rabbitmq 队列用完就删除吗 rabbitmq队列down_数据_11


 Recv.java

/**
 1. 简单的队列---Recv----消费者
 2. 1.消费者无非就是获取数据/使用数据
 */
public class Recv {
    private static final String QUEUE_NAME = "yunkai_queue"; //队列名称---在某个队列中读取数据

    public static void main(String[] args) {
        try {
            //连接RabbitMQ
            Connection connection = ConnectionUtil.getConnection();
            //创建队列
            Channel channel = connection.createChannel();
            /**
             * 创建队列---和生产者代码一致
             * 注意:生产者或消费者程序不存在优先级关系,所以在此声明队列的原因,是保证队列存在
             */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            /**
             * 内部静态类 --实现方法①
             * Lambda表达式--实现方法②
             *    lambda实现方式前提:必须是函数式接口(一个接口中只有一个方法)
             */
            DeliverCallback deliverCallback = new DeliverCallback() {
                @Override
                public void handle(String s, Delivery delivery) throws IOException {
                    //delivery.getBody()返回的是二进制数组-字节数组
                    String returnmsg = new String(delivery.getBody(), "utf-8");
                    System.out.println("成功读取到的消息为======" + returnmsg);
                }
            };
            /**
             * 消费者
             */
            channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumer -> {
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

   DeliverCallback子类所做的事情则是,告诉服务器将队列中的消息传递给我们,因为它是异步形式推送消息,所以我们提供了一个对象形式的回调,该对象将缓冲消息,我们使用的时候拿来用即可。

python rabbitmq 队列用完就删除吗 rabbitmq队列down_客户端_12

总结

   简单队列在此就完结了,对于简单队列场景,我进行了一个总结如下:

  1. 简单队列的实现方式由单个生产者和单个消费者所组成,但只适用于简单的队列场景。
  2. 简单队列的优点在于如其名,简单粗暴,易理解,易上手,适合初学者。

Ending

   到这里也就接近尾声了,本篇文章是RabbitMQ系列的第二章,如果您是初学者的话,建议从第一章看起,毕竟练武不练功,到老一场空嘛~~~