news 2026/9/14 12:48:14

如何在 Windows 上安装 Erlang 和 RabbitMQ 并完成首次消息收发?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 Windows 上安装 Erlang 和 RabbitMQ 并完成首次消息收发?

如何在 Windows 上安装 Erlang 和 RabbitMQ 并完成首次消息收发?

【免费下载链接】toBeBetterJavaer一份通俗易懂、风趣幽默的Java学习指南,内容涵盖Java基础、Java并发编程、Java虚拟机、Java企业级开发、Java面试等核心知识点。学Java,就认准二哥的Java进阶之路😄项目地址: https://gitcode.com/GitHub_Trending/to/toBeBetterJavaer

如果你想在 Windows 机器上跑起一个 RabbitMQ 消息队列,并完成第一次「生产者发消息、消费者收消息」,二哥的 Java 进阶之路 项目里的《RabbitMQ入门教程(概念、应用场景、安装、使用)》给出了完整路径:先装 Erlang,再装 RabbitMQ,确认服务状态,启用管理插件,最后用 Java 的 amqp-client 客户端完成首次消息收发。本文按这条路径还原整个过程。

为什么必须先装 Erlang

文档中给出的解释是:RabbitMQ 服务器是用 Erlang 语言编写的,它的安装包里并没有集成 Erlang 环境,因此需要先安装 Erlang,再安装 RabbitMQ。这也是标题顺序如此的原因。

安装 Erlang

打开 Erlang 官网下载页(erlang.org/download/otp_versions_tree.html)选择安装包。文档写作时说明的最新版本是 23.0.1,作者选择的是 64 位版本,大小约 104M。

下载完成后直接双击运行安装(文档中为 64 位版本的 otp_win64_23.0.1.exe),安装方式是图形化界面双击下一步。

文档作者记录到过一个现象:安装过程中电脑重启了一次,似乎是要安装一个库;重启后重新双击运行 otp_win64_23.0.1.exe 文件即可完成 Erlang 安装。如果你的机器也出现重启,按同样方式续装即可。

文档没有给出 Erlang 安装完成后的单独验证命令,作者是在 Erlang 安装成功后直接进入 RabbitMQ 安装步骤。

安装 RabbitMQ 并确认服务状态

Erlang 安装成功后,打开 RabbitMQ 官网的 Windows 安装页(www.rabbitmq.com/install-windows.html),选择页面上给出的 Windows 64 位安装包文件下载。文档示例中安装包只有 16.5M,下载完双击运行 exe 文件安装即可。

安装成功后,RabbitMQ 会作为 Windows 服务存在,可以从「开始」菜单管理 RabbitMQ Windows 服务。

确认启动状态的方法:从开始菜单打开「RabbitMQ Command Prompt (sbin dir)」,输入:

rabbitmqctl.bat status

文档示例的输出中包含这些信息(数值为文档示例,你的机器会不同):

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

能看到这些状态信息,说明 RabbitMQ 服务已经启动。

启用管理插件与 Web 管理端

命令行界面不太直观,文档建议启用管理 UI 插件:

rabbitmq-plugins enable rabbitmq_management

看到插件启用成功的提示信息,即可确认插件启用成功。然后在浏览器地址栏输入 http://localhost:15672/ 可以进入 RabbitMQ 管理端界面。管理端之后还能用来观察消息走势图,验证消息收发时会有用。

在 Java 项目中完成首次消息收发

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

添加客户端依赖

在项目的 pom.xml 中添加 RabbitMQ 客户端依赖(文档给出的版本为 5.9.0):

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

生产者:发送消息

新建生产者类 Wanger,队列名为 love:

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 + "'"); } } }

关键点(按文档说明):

  • ConnectionFactory 用来创建到 RabbitMQ 的默认连接(主机名为 localhost),再创建 Channel 来发送消息;Connection 和 Channel 都实现了 Closeable 接口,所以可以用 try-with-resource 语句。
  • 发送消息前必须通过 queueDeclare() 设置队列名称。
  • basicPublish() 的四个参数:第一个是 exchange,本场景不需要,设置为空字符串;第二个是 routingKey,这里用队列名填充;第三个是 BasicProperties,暂时不配置;第四个是消息主体,使用 UTF-8 字节数组以避免中文乱码。

注意:源文档给出的示例未列出 import 导入语句,编译前需要按代码中用到的类自行补全。

消费者:接收消息

新建消费者类 XiaoXiang,队列名同样是 love:

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 -> { }); } }

与生产者的区别(按文档说明):

  • 创建通道的代码和生产者差不多,但没有使用 try-with-resource 自动关闭连接和通道,因为希望消费者一直保持连接,直到你强制关闭它。
  • 接收消息同样通过 queueDeclare() 设置队列名称。
  • RabbitMQ 通过异步方式推送消息,所以要提供 DeliverCallback 回调处理收到的消息。
  • basicConsume() 第二个参数 autoAck 为 true 表示服务器一次性交付消息。

运行顺序与结果验证

先启动消费者类 XiaoXiang,它会打印「等待接收消息」并持续等待;再运行生产者类 Wanger,控制台打印[王二] 发送 '小巷,我喜欢你。',消费者控制台随即打印[小巷] 接收到的消息 '小巷,我喜欢你。',一次消息收发完成。

文档还演示了 autoAck 的效果:在启动消费者之前,先多次运行生产者向队列发送多条消息,消费者启动后会一次性收到全部消息。文档示例输出如下(对应多次发送后启动消费者的场景):

等待接收消息 [小巷] 接收到的消息 '小巷,我喜欢你。' [小巷] 接收到的消息 '小巷,我喜欢你。' [小巷] 接收到的消息 '小巷,我喜欢你。'

发送消息的过程中,也可以打开 http://localhost:15672/ 管理面板查看消息走势图,从图形上确认消息流量。

版本说明与边界

  • 文档演示环境为 Erlang 23.0.1(文档写作时说明的最新版本)、RabbitMQ 3.8.4、amqp-client 5.9.0,均保持文档原样;rabbitmqctl.bat status 输出中的 PID、版本等具体数值属于文档示例,不代表你机器上的固定结果。
  • 文档作者自述对 RabbitMQ 仅是入门级使用(「仅仅是因为要用,就学一下」),本文同样只覆盖安装与首次收发,不涉及集群、高可用等文档未展开的内容。
  • 文档没有提供 Windows 下更细粒度的故障排查步骤;如果某一步失败,可回到对应步骤核对:Erlang 是否安装完整、rabbitmqctl.bat status 是否显示服务状态、管理插件是否启用成功。

【免费下载链接】toBeBetterJavaer一份通俗易懂、风趣幽默的Java学习指南,内容涵盖Java基础、Java并发编程、Java虚拟机、Java企业级开发、Java面试等核心知识点。学Java,就认准二哥的Java进阶之路😄项目地址: https://gitcode.com/GitHub_Trending/to/toBeBetterJavaer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 12:47:50

Cool Retro Term自定义配置:打造个性化复古终端

Cool Retro Term自定义配置&#xff1a;打造个性化复古终端 【免费下载链接】cool-retro-term A good looking terminal emulator which mimics the old cathode display... 项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term 本文详细介绍了Cool Retr…

作者头像 李华
网站建设 2026/9/14 12:47:04

SSM框架在同城交易小程序开发中的优势与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 12:47:03

STM32以太网传感器固件重构:三态状态机实现数据可靠传输与断网补报

1. 一次被网络故障逼出来的重构&#xff1a;从串行轮到三态状态机大概两年前&#xff0c;我做了一款用于机房监控的以太网温湿度传感器。方案本身没什么新鲜的&#xff1a;STM32F103通过I2C读SHT30&#xff0c;数据用lwIP走TCP上报到局域网里的监控平台。当时我的想法很简单&am…

作者头像 李华
网站建设 2026/9/14 12:45:33

可口可乐经典广告《Hilltop》的音乐营销技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 12:40:13

OpenClaw+腾讯云实战:广告营销Agent基建部署与成本优化复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华