你是否据说过或者使用过队列?html
你是否据说过或者使用过消息队列?前端
你是否据说过或者使用过RabbitMQ?java
提到这几个词,用过的人,也许以为很简单,没用过的人,也许以为很复杂,至少在我没使用消息队列以前,听别人提到消息队列,都感受很复杂,很高深。git
好了,言归正传,本篇博客咱们就讲解下什么是消息队列,RabbitMQ环境的安装配置,最后经过一个Hello World示例了解下RabbitMQ的使用方法。github
队列是经常使用的数据结构之一,是一种特殊的线性表,特殊之处在于它只容许在表的前端(front)进行删除操做,而在表的后端(rear)进行插入操做。spring
进行插入操做的端称为队尾,进行删除操做的端称为对头。shell
在Java中,java.util包下已经有队列的相关实现,咱们能够直接使用。windows
消息是计算机/应用间传送的数据单位,能够很是简单,例如只包含文本字符串,也能够很复杂,可能包含嵌入对象。后端
消息队列是在消息的传输过程当中保存消息的容器。浏览器
消息传输时,先发送到队列,队列的主要目的是提供路由并保证消息的传递,若是发送消息时接收者不可用,消息队列会保留消息,直到能够成功的传递它。
能够把消息队列理解成快递公司,你须要寄一个物件(消息)给你的朋友,快递公司收到物件会保证物件送到你的朋友手中,可能存在屡次寄送才送达成功的状况,好比第一次送过去,你朋友不在家。
也许有人好奇,为何咱们不直接使用JDK自带的队列,而是要使用消息队列呢?
这是由于JDK自带的队列都存储在内存中,一但应用或者服务器挂了,消息就丢失了,使用消息队列能够避免消息丢失问题(注意不是100%不丢失),就像快递公司会保证你的物件寄到你的朋友手中,但确定有丢件的概率。
RabbitMQ是用Erlang语言开发的基于高级消息队列协议(AMQP)的消息队列中间件。
由于它开源,并且版本更新快,因此在国内互联网公司被普遍使用。
其它使用的消息中间件还有ActiveMQ,RocketMQ,Kafka等,有兴趣的同窗能够自行研究。
还有2个专业术语要了解下:
生产者:发送消息的应用程序被称为生产者。
消费者:接收消息的应用程序被称为消费者。
了解完基本概念,让咱们在本机上安装下RabbitMQ,由于它是基于Erlang语言开发的,因此咱们要先安装Erlang。
Erlang下载地址:www.erlang.org/downloads
由于个人电脑是Windows 64位系统,因此我下载的是64位的,系统是32位的同窗注意下版本。
安装过程比较简单,如下为部分截图:
安装完成后,须要新建个环境变量(打开方式:计算机--右键--属性--高级系统设置--高级--环境变量):
ERLANG_HOME E:\Program Files\erl10.4(修改成你的安装路径)
RabbitMQ下载地址:www.rabbitmq.com/install-win…
安装过程也比较简单,如下为部分截图:
安装完成后,在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的安装就算完成了,其中有几个默认值,咱们要知晓下:
浏览器输入http://localhost:15672/,咱们能够看到RabbitMQ的管理后台,而后使用默认的guest帐号登陆,在这个后台,能够完成新建用户,配置用户角色,新建队列等操做,固然,若是有的同窗比较喜欢命令行操做,也都有相对应的命令来完成操做,关于这些内容,后续单独再写博客讲解。
既然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:
是否是以为挺简单的呢,赶忙在本机安装试试吧!
源码地址:github.com/zwwhnly/spr…,欢迎下载。