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

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

你是否听说过或者使用过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 Files\erl10.4(修改为你的安装路径)

2.2 RabbitMQ安装及配置

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

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

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

"E:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.15\sbin\rabbitmq-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:我是一名奋斗在上海的程序员)。

RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例的更多相关文章

  1. RabbitMQ教程(一)——安装配置

    RabbitMQ教程(一)——安装配置 一.前言 由于最近在学习RabbitMQ消息队列,但是鉴于网上对于官网介绍的教程比较少或者由于时间长长期未更新,因此决定将对官网的RabbitMQ入门教程进行翻 ...

  2. QT开发环境安装配置教程

    QT开发环境安装配置教程 分类: QT2012-11-29 23:31 35366人阅读 评论(12) 收藏 举报 Linux版的直接在ubutnu软件中心输入QT,安装响应的Designer,Cre ...

  3. [转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程

    [转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程 [转]超详细MySQL安装及基本使用教程

  4. Meteor环境安装配置

    在本教程中,我们将展示如何在windows操作系统安装Meteor .在我们开始学习使用Meteor 之前,我们将需要NodeJS.如果你还没有安装它,则可以点击下表中的链接. 必须条件 Meteor ...

  5. Linux下xampp集成环境安装配置方法 、部署bugfree及部署禅道

    XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包.XAMPP 是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发行版.XAMPP 的确非 ...

  6. Sencha Toucha 2 —1.环境安装配置、在线打包、离线打包

    环境安装配置        1. 下载 1.1     Sencha Touch 下载 http://cdn.sencha.com/touch/sencha-touch-2.2.1-gpl.zip 1 ...

  7. [转载]SharePoint 2013测试环境安装配置指南

    软件版本 Windows Server 2012 标准版 SQL Server 2012 标准版 SharePoint Server 2013 企业版 Office Web Apps 2013 备注: ...

  8. Windows7 x64 跨平台开发环境安装配置

    ======================================================================= Windows7 x64 跨平台开发环境安装配置 201 ...

  9. 一个电脑的重装到java开发环境安装配置的全过程

    刚拿到一台别人用过的电脑.看着c盘爆满,而且用了还是windows7操作系统,强迫症发作马上就准备重装系统. 之前换固态使用wepe制作U盘启动盘装系统的步骤和过程全部忘记的,贼尴尬. 同事都看不过眼 ...

随机推荐

  1. next enum in swift

    enum Iter: Int{ case s1=0, s2, s3, s4 mutating func next(){ if self == .s4 { self = .s1 return } sel ...

  2. Python中定时任务框架APScheduler的快速入门指南

    前言 大家应该都知道在编程语言中,定时任务是常用的一种调度形式,在Python中也涌现了非常多的调度模块,本文将简要介绍APScheduler的基本使用方法. 一.APScheduler介绍 APSc ...

  3. boobmarklet

    bookmarklet ,一般都称呼为小书签.它是一段 JavaScript 脚本,一般网络上的小书签都是一个链接,它的安装非常简单,只需要把链接拖到你的收藏夹里. 利用它,可以实现一些页面优化.性能 ...

  4. 洛谷【P3437】[POI2006]TET-Tetris 3D

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 浅谈标记永久化:https://www.cnblogs.com/AKMer/p/1013 ...

  5. 更换mysql数据目录后出现 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 的解决办法

    服务器上的mysql默认数据目录为/var/lib/mysql/,同时服务器的/空间不是很大,而近期又有大量的日志需要导入进行分析,时常搞得/的空间捉襟见肘,晚上一狠心就想把mysql的数据目录转移到 ...

  6. KCF+Opencv3.0+Cmake+Win10 测试

    配置 需要的文件下载 安装CMake,安装opencv3.0.0 在KCFcpp-master 目录下新建一个文件夹,命名为build 打开CMake-GUI配置如下: 点击Configure,编译器 ...

  7. AR/VR-AR:AR

    ylbtech-AR/VR-AR:AR 增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像.视频.3D模型的技术,这种技术的目标是在屏 ...

  8. 性能测试之Jmeter学习(八)

    本节主要学习:断言 JMeter也有像LR中的检查点,本节就来介绍下JMeter的检查点如何去实现. JMeter里面的检查点通过添加断言来完成. 检查点:上一节讲到,我们对用户名和密码进行了参数化, ...

  9. 2-7 Flutter开发工具使用指南

    这里选择用哪个模拟器运行 Mac系统下可以通过这个Open IOS Siumlator打开IOS模拟器 debug用来调试的 可以创建新的模拟器 选择安卓模拟器的版本 这是sdk的配置 点开就是打开了 ...

  10. logging 模块使用

    1. logging 1.1 什么是 logging logging 模块是 Python 内置的日志管理模块,不需要额外安装. 使用: import logging logging.critical ...