zoukankan      html  css  js  c++  java
  • RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例

    你是否听说过或者使用过队列

    你是否听说过或者使用过消息队列

    你是否听说过或者使用过RabbitMQ

    提到这几个词,用过的人,也许觉得很简单,没用过的人,也许觉得很复杂,至少在我没使用消息队列之前,听别人提到消息队列,都感觉很复杂,很高深。

    好了,言归正传,本篇博客我们就讲解下什么是消息队列,RabbitMQ环境的安装配置,最后通过一个Hello World示例了解下RabbitMQ的使用方法。

    1. 基本概念讲解

    1.1 队列(Queue)

    队列是常用的数据结构之一,是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

    进行插入操作的端称为队尾,进行删除操作的端称为对头。

    在Java中,java.util包下已经有队列的相关实现,我们可以直接使用。

    1.2 消息队列(Message Queue)

    消息是计算机/应用间传送的数据单位,可以非常简单,例如只包含文本字符串,也可以很复杂,可能包含嵌入对象。

    消息队列是在消息的传输过程中保存消息的容器。

    消息传输时,先发送到队列,队列的主要目的是提供路由并保证消息的传递,如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功的传递它。

    可以把消息队列理解成快递公司,你需要寄一个物件(消息)给你的朋友,快递公司收到物件会保证物件送到你的朋友手中,可能存在多次寄送才送达成功的情况,比如第一次送过去,你朋友不在家。

    也许有人好奇,为什么我们不直接使用JDK自带的队列,而是要使用消息队列呢?

    这是因为JDK自带的队列都存储在内存中,一但应用或者服务器挂了,消息就丢失了,使用消息队列可以避免消息丢失问题(注意不是100%不丢失),就像快递公司会保证你的物件寄到你的朋友手中,但肯定有丢件的几率。

    1.3 RabbitMQ

    RabbitMQ是用Erlang语言开发的基于高级消息队列协议(AMQP)的消息队列中间件。

    因为它开源,而且版本更新快,所以在国内互联网公司被广泛使用。

    其它使用的消息中间件还有ActiveMQ,RocketMQ,Kafka等,有兴趣的同学可以自行研究。

    还有2个专业术语要了解下:

    生产者:发送消息的应用程序被称为生产者。

    消费者:接收消息的应用程序被称为消费者。

    2. RabbitMQ安装及配置

    了解完基本概念,让我们在本机上安装下RabbitMQ,因为它是基于Erlang语言开发的,所以我们要先安装Erlang。

    2.1 Erlang安装及配置

    Erlang下载地址:http://www.erlang.org/downloads

    因为我的电脑是Windows 64位系统,所以我下载的是64位的,系统是32位的同学注意下版本。

    安装过程比较简单,以下为部分截图:

    安装完成后,需要新建个环境变量(打开方式:计算机--右键--属性--高级系统设置--高级--环境变量):

    ERLANG_HOME E:Program Fileserl10.4(修改为你的安装路径)

    2.2 RabbitMQ安装及配置

    RabbitMQ下载地址:https://www.rabbitmq.com/install-windows.html

    安装过程也比较简单,以下为部分截图:

    安装完成后,在cmd窗口中执行以下命令激活RabbitMQ Manage Plugin

    "E:Program FilesRabbitMQ Server
    abbitmq_server-3.7.15sbin
    abbitmq-plugins.bat" enable rabbitmq_management
    

    然后执行命令重启RabbitMQ服务:

    net stop RabbitMQ && net start RabbitMQ
    

    如果你的cmd窗口不是以管理员身份打开的,会出现如下报错信息

    解决方法也很简单,以管理员身份打开cmd窗口执行命令即可

    关于这一步,可以不使用命令重启RabbitMQ服务,而是打开Windows的服务列表,找到RabbitMQ服务,重启即可。

    到这一步,RabbitMQ的安装就算完成了,其中有几个默认值,我们要知晓下:

    • 默认的端口号:5672
    • 默认的用户是guest guest
    • 管理后台的默认端口号:15672

    浏览器输入http://localhost:15672/,我们可以看到RabbitMQ的管理后台,然后使用默认的guest账号登录,在这个后台,可以完成新建用户,配置用户角色,新建队列等操作,当然,如果有的同学比较喜欢命令行操作,也都有相对应的命令来完成操作,关于这些内容,后续单独再写博客讲解。

    3. Hello World示例

    既然RabbitMQ环境安装好了,那么我们通过1个简单的示例来看下效果。

    首先在pom文件中,添加依赖:

    <dependency>
       <groupId>com.rabbitmq</groupId>
       <artifactId>amqp-client</artifactId>
       <version>5.7.0</version>
    </dependency>
    

    然后新建一个生产者类(Producer),用来新建一个队列'hello',然后往队列里发送消息‘Hello World’:

    package com.zwwhnly.springbootaction.rabbitmq.helloworld;
    
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class Producer {
        private final static String QUEUE_NAME = "hello";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            // 创建连接
            ConnectionFactory factory = new ConnectionFactory();
            // 设置 RabbitMQ 的主机名
            factory.setHost("localhost");
            // 创建一个连接
            Connection connection = factory.newConnection();
            // 创建一个通道
            Channel channel = connection.createChannel();
            // 指定一个队列,不存在的话自动创建
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            // 发送消息
            String message = "Hello World!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
            // 关闭频道和连接
            channel.close();
            connection.close();
        }
    }
    

    运行代码,在RabbitMQ管理后台,会看到队列新建成功,并且有1个消息待消费:

    最后我们新建一个消费者类(Consumer),用来消费这个消息:

    package com.zwwhnly.springbootaction.rabbitmq.helloworld;
    
    import com.rabbitmq.client.*;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class Consumer {
        private final static String QUEUE_NAME = "hello";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            // 创建连接
            ConnectionFactory factory = new ConnectionFactory();
            // 设置 RabbitMQ 的主机名
            factory.setHost("localhost");
            // 创建一个连接
            Connection connection = factory.newConnection();
            // 创建一个通道
            Channel channel = connection.createChannel();
            // 指定一个队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            // 创建队列消费者
            com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope,
                                           AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println("Received Message '" + message + "'");
                }
            };
            channel.basicConsume(QUEUE_NAME, true, consumer);
        }
    }
    

    运行代码,我们会发现控制台输出:

    Received Message 'Hello World!'

    此时再看下RabbitMQ管理后台,会发现队列'hello'待消费的消息为0:

    是不是觉得挺简单的呢,赶紧在本机安装试试吧!

    4. 源码及参考

    源码地址:https://github.com/zwwhnly/springboot-action.git,欢迎下载。

    windows下 安装 rabbitMQ 及操作常用命令

    【译】RabbitMQ 实战教程(一) Hello World!

    原创不易,如果觉得文章能学到东西的话,欢迎点个赞、评个论、关个注,这是我坚持写作的最大动力。

    如果有兴趣,欢迎添加我的微信:zwwhnly,等你来聊技术、职场、工作等话题(PS:我是一名奋斗在上海的程序员)。

  • 相关阅读:
    青花瓷Java版
    让Broncho A1支持usbnet
    系统程序员成长计划组合的威力(三)
    【转】多CPU上的原子操作
    c#和javascript交互
    修改代码时有时会出现找不到某个组件
    UML用例建模的慨念和应用
    DJ曲二
    查询数据库里的存储过程的文本中的某个内容
    UML静态建模
  • 原文地址:https://www.cnblogs.com/zwwhnly/p/10911926.html
Copyright © 2011-2022 走看看