必须严格匹配rabbitmq主版本号(如3.12.0)下载对应插件,用rabbitmqctl version确认真实版本,下载同名.ez文件;插件需正确复制到plugins目录、设权限、启用并重启服务;docker中禁用挂载整个plugins目录,推荐构建镜像或docker cp后启用;声明x-delayed-message交换机时必须指定{"x-delayed-type":"direct"}参数,发送消息须用headers带x-delay字段。

延迟队列插件 rabbitmq_delayed_message_exchange 不能“通用安装”,必须和 rabbitmqctl version 输出的主版本号(如 3.12.0)完全一致,否则启用失败、服务崩溃、容器起不来——这是最常踩的坑。
查清 RabbitMQ 真实版本再下载插件
别信 rabbitmq-server --version 或 Docker 镜像 tag,它可能漏掉补丁号。唯一可信的是:
-
rabbitmqctl version—— 输出类似3.12.0,这就是你要找的版本号 - 去 GitHub Releases 页面:
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases - 严格匹配下载
rabbitmq_delayed_message_exchange-3.12.0.ez(注意:不是3.12.x,也不是“latest”) - 3.12.x 插件在 3.11.x 上会报错
missing dependency: rabbitmq_server-3.12.0
原生安装:复制路径 + 权限 + 启用三步缺一不可
插件文件放错位置或权限不对,rabbitmq-plugins enable 会静默失败(没报错但不生效)。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 先查真实插件目录:
rabbitmq-plugins directories,常见路径是/usr/lib/rabbitmq/lib/rabbitmq_server-3.12.0/plugins/ - 复制并设权:
sudo cp rabbitmq_delayed_message_exchange-3.12.0.ez /path/to/plugins/;然后sudo chown rabbitmq:rabbitmq /path/to/plugins/rabbitmq_delayed_message_exchange-3.12.0.ez;再sudo chmod 644 /path/to/plugins/*.ez - 启用命令里**不带版本号、不带 .ez**:
sudo rabbitmq-plugins enable rabbitmq_delayed_message_exchange - 重启服务:
sudo systemctl restart rabbitmq-server
Docker 环境:严禁挂载整个 plugins 目录
用 -v /host/plugins:/plugins 会覆盖 RabbitMQ 自带的核心插件(比如 rabbitmq_management),导致启动时报 Failed to load module 'rabbit'。
- 推荐方式一(构建镜像):
COPY rabbitmq_delayed_message_exchange-3.12.0.ez /opt/rabbitmq/plugins/,再RUN rabbitmq-plugins enable rabbitmq_delayed_message_exchange - 推荐方式二(运行时注入):
docker cp rabbitmq_delayed_message_exchange-3.12.0.ez container_name:/opt/rabbitmq/plugins/,再docker exec -it container_name rabbitmq-plugins enable rabbitmq_delayed_message_exchange - 验证是否启用:
sudo rabbitmq-plugins list | grep delayed,看到[E*] rabbitmq_delayed_message_exchange才算成功
声明交换机与发消息时的关键参数
插件启用后,Web 界面的 Exchanges 页会出现 x-delayed-message 类型,但光有它还不够——声明和使用都必须显式指定参数。
- 声明交换机时,必须传
{"x-delayed-type":"direct"}(或其他合法类型,如topic),不能只选类型不传参数 - 发送消息时,必须用
headers带x-delay字段,单位毫秒:{"headers":{"x-delay":30000}};不能写成delay或放在 properties 其他位置 - 如果消息没延迟,优先检查:
交换机类型是否为 x-delayed-message、是否用了 x-delay header、是否在该交换机上绑定了队列
最容易被忽略的是:插件启用后,RabbitMQ 不会自动把旧交换机升级成延迟型,所有延迟逻辑都依赖新建的 x-delayed-message 交换机,且每次声明都必须带 x-delayed-type 参数——漏掉这个 JSON 参数,交换机就只是个普通交换机,x-delay header 会被直接忽略。










