当前位置: 首页 > news >正文

rabbitmq延迟消息示例

官方插件仅支持>=3.6.x 版本中支持。

本文描述的消息延迟机制采用官方推荐的插件rabbitmq-delayed-message-exchange,如精通rabbitmq和编程,请自行查看官方文档,描述更加详尽:

  • github
  • Rabbitmq插件列表

安装

需要在集群每台机器中安装

由于rabbitmq并未内置该插件,需要手动下载安装。关于已安装的插件通过rabbitmq-plugins list可查看.

  • 3.6.x下载地址
  • 3.7.x下载地址

加载后解压,并将其拷贝至(使用Linux Debian/RPM部署)rabbitmq服务器目录:/usr/lib/rabbitmq/plugins中(windows和其他系统<安装目录>\rabbitmq_server-version\plugins).

启用插件

需要在集群每台机器中执行

通过rabbitmq-plugins list查看已安装列表,如下:

...
[ ] rabbitmq_delayed_message_exchange 20171215-3.6.x
...

使用命令rabbitmq-plugins enable rabbitmq_delayed_message_exchang启用插件,输出如下:

The following plugins have been enabled:
  rabbitmq_delayed_message_exchange

通过rabbitmq-plugins list查看已安装列表,如下:

...
[E*] rabbitmq_delayed_message_exchange 20171215-3.6.x
...

机制

安装插件后会生成新的Exchange类型x-delayed-message,该类型消息支持延迟投递机制,接收到消息后并未立即将消息投递至目标队列中,而是存储在mnesia(一个分布式数据系统)表中,检测消息延迟时间,如达到可投递时间时并将其通过x-delayed-type类型标记的交换机类型投递至目标队列。

Java使用过程

声明x-delayed-message消息交换机

  • rabbitmq java client实现
// ... elided code ...
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-delayed-type", "direct");
channel.exchangeDeclare("my-exchange", "x-delayed-message", true, false, args);
// ... more code ...
  • spring rabbitmq template实现

// ... elided code ...
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
Exchange exchange = new CustomExchange("test.exchange", "x-delayed-message", true, false, args);
//admin = RabbitmqAdmin
admin.declareExchange(exchange);

//more code...

消息发送

  • rabbitmq java client实现
// ... elided code ...
byte[] messageBodyBytes = "delayed payload".getBytes("UTF-8");
Map<String, Object> headers = new HashMap<String, Object>();
headers.put("x-delay", 5000);
AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder().headers(headers);
channel.basicPublish("test.exchange", "test", props.build(), messageBodyBytes);
// ... more code ...
  • spring rabbitmq template实现
MessageProperties properties = new MessageProperties();
properties.setHeader("x-delay", 1000);
//template : RabbitmqTemplate
template.convertAndSend("test.exchange", "test", new Message(body, properties));

相关文章:

  • JS易混淆的方法整理
  • 转型成亚洲三大通信展主题 中国企业参与积极
  • 诡异!React stopPropagation失灵
  • Unix环境高级编程(四)数据系统文件和信息
  • 算法初级之二
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • 人民日报发声,区块链成“兵家必争之地”,或成“国家战略”
  • iOS下JS与OC互相调用(八)--Cordova详解+实战
  • itextsharp display:none无效的bug
  • SaaS型平台产品的POS营销经营策略
  • BeanUtils工具类的使用
  • Linux配置虚拟网站主机
  • 阿里云ECS服务器安装jdk
  • 素材哪里找?一个好的图库
  • POJ1631 LIS模板
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android组件 - 收藏集 - 掘金
  • CentOS从零开始部署Nodejs项目
  • CSS实用技巧
  • es6
  • flutter的key在widget list的作用以及必要性
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • magento2项目上线注意事项
  • Node项目之评分系统(二)- 数据库设计
  • XForms - 更强大的Form
  • 从零开始的无人驾驶 1
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于Java中分层中遇到的一些问题
  • 关于springcloud Gateway中的限流
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 算法-插入排序
  • 详解NodeJs流之一
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • #includecmath
  • #pragma once
  • $jQuery 重写Alert样式方法
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C++17) optional的使用
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (五)Python 垃圾回收机制
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) Android中ViewStub组件使用
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .naturalWidth 和naturalHeight属性,
  • .NET/C# 使窗口永不获得焦点
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [BROADCASTING]tensor的扩散机制
  • [BUUCTF]-Reverse:reverse3解析
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [codeforces]Levko and Permutation
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [HNOI2018]排列