摘要:进行插入操作的端称为队尾,进行删除操作的端称为对头。还有个专业术语要了解下生产者发送消息的应用程序被称为生产者。消费者接收消息的应用程序被称为消费者。参考链接下安装及操作常用命令译实战教程一
你是否听说过或者使用过队列?
你是否听说过或者使用过消息队列?
你是否听说过或者使用过RabbitMQ?
提到这几个词,用过的人,也许觉得很简单,没用过的人,也许觉得很复杂,至少在我没使用消息队列之前,听别人提到消息队列,都感觉很复杂,很高深。
好了,言归正传,本篇博客我们就讲解下什么是消息队列,RabbitMQ环境的安装配置,最后通过一个Hello World示例了解下RabbitMQ的使用方法。
1.基本概念讲解 1.1队列(Queue)队列是常用的数据结构之一,是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为对头。
在Java中,java.util包下已经有队列的相关实现,我们可以直接使用。
1.2消息队列(Message Queue)
消息是计算机/应用间传送的数据单位,可以非常简单,例如只包含文本字符串,也可以很复杂,可能包含嵌入对象。
消息队列是在消息的传输过程中保存消息的容器。
消息传输时,先发送到队列,队列的主要目的是提供路由并保证消息的传递,如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功的传递它。
可以把消息队列理解成快递公司,你需要寄一个物件(消息)给你的朋友,快递公司收到物件会保证物件送到你的朋友手中,可能存在多次寄送才送达成功的情况,比如第一次送过去,你朋友不在家。
也许有人好奇,为什么我们不直接使用JDK自带的队列,而是要使用消息队列呢?
这是因为JDK自带的队列都存储在内存中,一但应用或者服务器挂了,消息就丢失了,使用消息队列可以避免消息丢失问题(注意不是100%不丢失),就像快递公司会保证你的物件寄到你的朋友手中,但肯定有丢件的几率。
1.3RabbitMQRabbitMQ是用Erlang语言开发的基于高级消息队列协议(AMQP)的消息队列中间件。
因为它开源,而且版本更新快,所以在国内互联网公司被广泛使用。
其它使用的消息中间件还有ActiveMQ,RocketMQ,Kafka等,有兴趣的同学可以自行研究。
还有2个专业术语要了解下:
生产者:发送消息的应用程序被称为生产者。
消费者:接收消息的应用程序被称为消费者。
2.RabbitMQ安装及配置了解完基本概念,让我们在本机上安装下RabbitMQ,因为它是基于Erlang语言开发的,所以我们要先安装Erlang。
2.1Erlang安装及配置Erlang下载地址:www.erlang.org/downloads
因为我的电脑是Windows 64位系统,所以我下载的是64位的,系统是32位的同学注意下版本。
安装过程比较简单,以下为部分截图:
安装完成后,需要新建个环境变量(打开方式:计算机--右键--属性--高级系统设置--高级--环境变量):
2.2RabbitMQ安装及配置ERLANG_HOME E:Program Fileserl10.4(修改为你的安装路径)
RabbitMQ下载地址:www.rabbitmq.com/install-win…
安装过程也比较简单,以下为部分截图:
安装完成后,在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.rabbitmqgroupId>
<artifactId>amqp-clientartifactId>
<version>5.7.0version>
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.源码源码地址:github.com/zwwhnly/spr…,欢迎下载。
5.参考链接windows下 安装 rabbitMQ 及操作常用命令
【译】RabbitMQ 实战教程(一) Hello World!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/7184.html
摘要:基础教程注本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。安装库这里我们首先将消息推入队列,然后消费者从队列中去除消息进行消费。 RabbitMQ 基础教程(1) - Hello World 注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。 如果你喜欢我的文章,可以关注我的私人博客:http:...
摘要:平均每个消费者将得到相同数量的消息。消息确认完成任务可能需要几秒钟。为了确保消息不会丢失,支持消息确认。没有任何消息超时当这个消费者中止了,将会重新分配消息时。这是因为只是调度消息时,消息进入队列。 showImg(https://segmentfault.com/img/bVXNuN?w=332&h=111); 介绍 在上一个 Hello World 教程中,我们编写了从指定队列发送...
摘要:在中间的框是一个队列的消息缓冲区,保持代表的消费。本教程介绍,这是一个开放的通用的协议消息。我们将在本教程中使用,解决依赖管理。发送者将连接到,发送一条消息,然后退出。注意,这与发送发布的队列匹配。 介绍 RabbitMQ是一个消息代理器:它接受和转发消息。你可以把它当作一个邮局:当你把邮件放在信箱里时,你可以肯定邮差先生最终会把邮件送到你的收件人那里。在这个比喻中,RabbitMQ就...
摘要:每当我们收到一条消息,这个回调函数就被皮卡库调用。接下来,我们需要告诉这个特定的回调函数应该从我们的队列接收消息为了让这个命令成功,我们必须确保我们想要订阅的队列存在。生产者计划将在每次运行后停止欢呼我们能够通过发送我们的第一条消息。 源码:https://github.com/ltoddy/rabbitmq-tutorial 介绍 RabbitMQ是一个消息代理:它接受和转发消息。你...
摘要:然而实际业务中还存在另外一种定时任务,它可能需要一些触发条件才开始定时,比如编写博文时候,设置小时之后发送。在消息监听类中,对通道定义了,这里会对延迟消息做具体的逻辑。由于消息的消费是延迟的,从而变相实现了从消息发送那一刻起开始的定时任务。 应用场景 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者...
阅读 2928·2021-10-14 09:43
阅读 2866·2021-10-14 09:42
阅读 4639·2021-09-22 15:56
阅读 2355·2019-08-30 10:49
阅读 1587·2019-08-26 13:34
阅读 2369·2019-08-26 10:35
阅读 590·2019-08-23 17:57
阅读 2022·2019-08-23 17:15