拼多多面试官没想到RabbitMQ我早就入门了,人直接傻掉。

人一辈子最值得炫耀的不应该是你的财富有多少(虽然这话说得有点违心,呵呵),而是你的学习能力。技术更新迭代的速度非常快,那作为程序员,我们就应该拥有一颗拥抱变化的心,积极地跟进。

在 RabbitMQ 入门之前,我已经入门了 Redis、Elasticsearch 和 MongoDB,这让我感觉自己富有极客精神,非常良好。

小伙伴们在继续阅读之前,我必须要声明一点,我对 RabbitMQ 并没有进行很深入的研究,仅仅是因为要用,就学一下。但作为一名负责任的技术博主,我是动了心的,这篇入门教程,小伙伴们读完后绝对会感到满意,忍不住无情地点赞,以及赤裸裸地转发。

当然了,小伙伴们遇到文章中有错误的地方,不要手下留情,可以组团过来捶我,但要保证一点,不要打脸,我怕毁容。

01、RabbitMQ 是什么

首先,我知道,Rabbit 是一只兔子(哎呀妈呀,忍不住秀了一波自己的英语功底),可爱的形象已经跃然于我的脑海中了。那 MQ 又是什么呢?是 Message Queue 的首字母缩写,也就是说 RabbitMQ 是一款开源的消息队列系统。

RabbitMQ 的主要特点在于健壮性好、易于使用、高性能、高并发、集群易扩展,以及强大的开源社区支持。反正就是很牛逼的样子。

九年前我做大宗期货交易的时候,也需要消息推送,那时候还不知道去找这种现成的中间件,就用自定义的队列实现,结果搞了不少 bug,有些到现在还没有解决,真的是不堪回首的往事啊。

下图是 RabbitMQ 的消息模型图(来源于网络,侵删),小伙伴们来感受下。

1)P 是 Producer,代表生产者,也就是消息的发送者,可以将消息发送到 X

2)X 是 Exchange(为啥不是 E,我也很好奇),代表交换机,可以接受生产者发送的消息,并根据路由将消息发送给指定的队列

3)Q 是 Queue,也就是队列,存放交换机发送来的消息

4)C 是 Consumer,代表消费者,也就是消息的接受者,从队列中获取消息

听我这样一解释,是不是对 RabbitMQ 的印象就很具象化了?小伙伴们,学起来吧!

02、安装 Erlang

咦,怎么不是安装 RabbitMQ 啊?先来看看官方的解释。

英文看不太懂,没关系,我来补充两句人话。RabbitMQ 服务器是用 Erlang 语言编写的,它的安装包里并没有集成 Erlang 的环境,因此需要先安装 Erlang。小伙伴们不要担心,Erlang 安装起来没有任何难度。

Erlang 下载地址如下:

https://erlang.org/download/otp_versions_tree.html

最新的版本是 23.0.1,我选择的是 64 位的版本,104M 左右。下载完就可以双击运行安装,傻瓜式的。

需要注意的是,我安装的过程中,电脑重启了一次,好像要安装一个什么库,重启之前忘记保存图片了(sorry)。重启后,重新双击运行 otp_win64_23.0.1.exe 文件完成 Erlang 安装。

03、安装 RabbitMQ

Erlang 安装成功后,就可以安装 RabbitMQ 了。下载地址如下所示:

https://www.rabbitmq.com/install-windows.html

找到下图中的位置,选择红色框中的文件进行下载。

安装包只有 16.5M 大小,还是非常轻量级的。下载完后直接双击运行 exe 文件就可以傻瓜式地安装了。

安装成功后,就可以将 RabbitMQ 作为 Windows 服务启动,可以从“开始”菜单管理 RabbitMQ Windows 服务。

点击「RabbitMQ Command Prompt (sbin dir)」,进入命令行,输入 rabbitmqctl.bat status 可确认 RabbitMQ 的启动状态。

可以看到 RabbitMQ 一些状态信息:

  • 进程 ID,也就是 PID 为 2816
  • 操作系统为 Windows
  • 当前的版本号为 3.8.4
  • Erlang 的配置信息

命令行界面看起来不够优雅,因此我们可以输入以下命令来启用客户端管理 UI 插件:

rabbitmq-plugins enable rabbitmq_management

看到以下信息就可以确认插件启用成功了。

在浏览器地址栏输入 http://localhost:15672/ 可以进入管理端界面,如下图所示:

04、在 Java 中使用 RabbitMQ

有些小伙伴可能会问,“二哥,我是一名 Java 程序员,我该如何在 Java 中使用 RabbitMQ 呢?”这个问题问得好,这就来,这就来。

第一步,在项目中添加 RabbitMQ 客户端依赖:

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

第二步,我们来模拟一个最简单的场景,一个生产者发送消息到队列中,一个消费者从队列中读取消息并打印。

官方对 RabbitMQ 有一个很好的解释,我就“拿来主义”的用一下。在我上高中的年代,同学们之间最流行的交流方式不是 QQ、微信,甚至短信这些,而是书信。因为那时候还没有智能手机,况且上学期间学校也是命令禁用手机的,所以书信是情感表达的最好方式。好怀念啊。

假如我向女朋友小巷写了一封情书,内容如下所示:

致小巷
你好呀,小巷。
你走了以后我每天都感到很闷,就像堂吉诃德一样,每天想念托波索的达辛妮亚。我现在已经养成了一种习惯,就是每两三天就要找你说几句不想对别人说的话。
。。。。。。
王二,5月20日

那这封情书要寄给小巷,我就需要跑到邮局,买上邮票,投递到邮箱当中。女朋友要收到这封情书,就需要邮递员尽心尽力,不要弄丢了。

RabbitMQ 就像邮局一样,只不过处理的不是邮件,而是消息。之前解释过了,P 就是生产者,C 就是消费者。

新建生产者类 Wanger :

public class Wanger {private final static String QUEUE_NAME = "love";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "小巷,我喜欢你。";channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));System.out.println(" [王二] 发送 '" + message + "'");}}
}

1)QUEUE_NAME 为队列名,也就是说,生产者发送的消息会放到 love 队列中。

2)通过以下方式创建服务器连接:

ConnectionFactory factory = new ConnectionFactory();
try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {

ConnectionFactory 是一个非常方便的工厂类,可用来创建到 RabbitMQ 的默认连接(主机名为“localhost”)。然后,创建一个通道( Channel)来发送消息。

Connection 和 Channel 类都实现了 Closeable 接口,所以可以使用 try-with-resource 语句,如果有小伙伴对 try-with-resource 语句不太熟悉,可以查看我之前写的我去文章。

3)在发送消息的时候,必须设置队列名称,通过 queueDeclare() 方法设置。

4)basicPublish() 方法用于发布消息:

  • 第一个参数为交换机(exchange),当前场景不需要,因此设置为空字符串;
  • 第二个参数为路由关键字(routingKey),暂时使用队列名填充;
  • 第三个参数为消息的其他参数(BasicProperties),暂时不配置;
  • 第四个参数为消息的主体,这里为 UTF-8 格式的字节数组,可以有效地杜绝中文乱码。

生产者类有了,接下来新建消费者类 XiaoXiang:

public class XiaoXiang {private final static String QUEUE_NAME = "love";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory = new ConnectionFactory();Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println("等待接收消息");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [小巷] 接收到的消息 '" + message + "'");};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}
}

1)创建通道的代码和生产者差不多,只不过没有使用 try-with-resource 语句来自动关闭连接和通道,因为我们希望消费者能够一直保持连接,直到我们强制关闭它。

2)在接收消息的时候,必须设置队列名称,通过 queueDeclare() 方法设置。

3)由于 RabbitMQ 将会通过异步的方式向我们推送消息,因此我们需要提供了一个回调,该回调将对消息进行缓冲,直到我们做好准备接收它们为止。

DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [小巷] 接收到的消息 '" + message + "'");
};

basicConsume() 方法用于接收消息:

  • 第一个参数为队列名(queue),和生产者相匹配(love)。

  • 第二个参数为 autoAck,如果为 true 的话,表明服务器要一次性交付消息。怎么理解这个概念呢?小伙伴们可以在运行消费者类 XiaoXiang 类之前,先多次运行生产者类 Wanger,向队列中发送多个消息,等到消费者类启动后,你就会看到多条消息一次性接收到了,就像下面这样。

等待接收消息[小巷] 接收到的消息 '小巷,我喜欢你。'[小巷] 接收到的消息 '小巷,我喜欢你。'[小巷] 接收到的消息 '小巷,我喜欢你。'
  • 第三个参数为 DeliverCallback,也就是消息的回调函数。

  • 第四个参数为 CancelCallback,我暂时没搞清楚是干嘛的。

在消息发送的过程中,也可以使用 RabbitMQ 的管理面板查看到消息的走势图,如下所示。

05、鸣谢

好了,我亲爱的小伙伴们,以上就是本文的全部内容了,是不是看完后很想实操一把 RabbitMQ,赶快行动吧!如果你在学习的过程中遇到了问题,欢迎随时和我交流,虽然我也是个菜鸟,但我有热情啊。

另外,如果你想写入门级别的文章,这篇就是最好的范例。

我是沉默王二,一枚有趣的程序员。如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读,回复【666】更有我为你精心准备的 500G 高清教学视频(已分门别类)。

本文 GitHub 已经收录,有大厂面试完整考点,欢迎 Star。

原创不易,莫要白票,请你为本文点个赞吧,这将是我写作更多优质文章的最强动力。

拼多多面试官没想到RabbitMQ我早就入门了,人直接傻掉相关推荐

  1. 拼多多面试官没想到ThreadLocal我用得这么溜,人直接傻掉

    点赞再看,养成习惯,微信搜一搜[敖丙]关注这个互联网苟且偷生的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列 ...

  2. java resume过时方法_面试官没想到,一个 Java 线程生命周期,我可以扯半小时

    面试官:你不是精通 Java 并发吗?从基础的 Java 线程生命周期开始讲讲吧. 好的,面试官.吧啦啦啦... 如果要说 Java 线程的生命周期的话,那我觉得就要先说说操作系统的线程生命周期 因为 ...

  3. 美团运维面试官没想到jenkins我用得这么溜,人直接傻掉

    前言 春天来了,在家玩了半年,也该出去散散心了,顺便收获几个offer练练手,要不然都没有办法给小伙伴们发面试题了. 所谓知己知彼方能百战不殆,我先是在网上搜索了一下关于最近的运维职位,发现还行,大多 ...

  4. 阿里面试官没想到一个HashMap,我能跟他扯半小时

    你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 上已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Sta ...

  5. 2020最新软件测试面试题汇总【内附参考答案】,拼多多面试官看了都说,卧槽!!!

    2020最新软件测试面试题汇总[内附参考答案] 测试技术面试题 1.什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台.软件平台上是否可以正常的运行,即是通 ...

  6. 面试官没想到,一个SQL,我可以扯一小时

    补充作业一 设有三个关系: S(SNO, SNAME, AGE, SEX,Sdept) SC(SNO, CNO, GRADE) C(CNO, CNAME, TEACHER) 试用关系代数表达式表示下列 ...

  7. 多多情报通:拼多多两天没发货会怎样处理?延迟交货怎么办?

    拼多多商家参加活动时,有时因为交货量太大,无法及时交货,那么如果拼多多两天没发货会怎样处理?拼多多好几天没发货怎么办?拼多多延迟交货怎么办?下面就来告诉你. 拼多多两天没发货会怎样处理? 拼多多将被认 ...

  8. 拼多多制假售假 却没人管 已经无法无天了!

    拼多多制假售假 却没人管 已经无法无天了!

  9. 2019校招内推拼多多面试总结

    感想 我想这次应该是我凭实力得到的第一个比较满意的offer了,没想到是拼多多给的offer,我也感谢面试我的那些面试官,没有为难我. 过程 拼多多 一面 1.自我介绍 2.树模型,GBDT的原理,x ...

最新文章

  1. ML 03、机器学习的三要素
  2. 评价一个人,就是要看他把时间都花在哪了
  3. 百练2815 城堡问题
  4. 计算机配置里 无 管理模板,组策略里打开后没有管理模板
  5. IntelliJ IDEA 2020修改菜单显示大小
  6. ACM模式数组构建二叉树
  7. iPhone13最新外观售价曝光:好看还便宜
  8. nodejs发送电子邮件的更新
  9. FastStone Capture 画图吸色工具
  10. np.dot、np.outer、np.matmul、np.multipy、np.inner、np.outer与np.cross几个函数之间的区别
  11. 爆火的羊了个羊背后暗含的广告变现逻辑是什么?
  12. 查看spark版本linux,如何查看spark版本和scala版本
  13. kali linux 虚拟机iso 下载,Kali Linux 2016.2发布提供虚拟机以及系统镜像下载
  14. 5款良心电脑软件,有一款虽已停更,却依然免费使用
  15. UTM的XY坐标转换为WGS84经纬度坐标
  16. 动物叫声合集v1.0支持25种动物叫声模拟
  17. 全国计算机一级考试试题大题,全国计算机等级考试一级考试练习(新大纲)试题及答案...
  18. sessionStorage 存储和获取对象
  19. uniApp打包以及发布
  20. Word转Chm 在线转换应用

热门文章

  1. taichi的安装——PyCharm
  2. 第四次个人作业——关于微软必应词典android客户端的案例分析
  3. Opencv如何打开使用海康工业相机
  4. 查看was发布的应用程序的端口
  5. vue中插槽solt的使用
  6. [2010-02-21] 一场关于Google成功因素的大辩论
  7. 用TextPAD构建你的JAVA IDE
  8. 解决校园内网“哆点软件”登录时出现“http://www.msftconnecttest.com/redirect 找不到应用程序”问题
  9. 牛客java选择题每日打卡Day8
  10. MOXA NPort5650 串口设备联网服务器