502
人物
定时消息和延时消息__特色功能_消息队列 MQ-阿里云
本文档主要介绍 MQ 定时消息和延时消息的概念、适用场景以及使用过程中的注意事项。
概念介绍
- 定时消息:Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消息。
- 延时消息:Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是延迟一定时间后才投递到 Consumer 进行消费,该消息即延时消息。
定时消息与延迟消息在代码配置上存在一些差异,但是最终达到的效果相同:消息在发送到 MQ 服务端后并不会立马投递,而是根据消息中的属性延迟固定时间后才投递给消费者。
适用场景
定时/延时消息适用于如下一些场景:
- 消息生产和消费有时间窗口要求:比如在电商交易中超时未支付关闭订单的场景,在订单创建时会发送一条 MQ 延时消息,这条消息将会在30分钟以后投递给消费者,消费者收到此消息后需要判断对应的订单是否已完成支付。如支付未完成,则关闭订单,如已完成支付则忽略。
- 通过消息触发一些定时任务,比如在某一固定时间点向用户发送提醒消息。
使用方式
定时消息、延时消息的使用在代码编写上存在略微的区别:
- 发送定时消息需要明确指定消息发送时间点之后的某一时间点作为消息投递的时间点。
- 发送延时消息时需要设定一个延时时间长度,消息将从当前发送时间点开始延迟固定时间之后才开始投递。
发送定时消息
public class ProducerDelayTest {
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(PropertyKeyConst.ProducerId, "XXX");//您在 MQ 控制台创建的 Producer ID
properties.put(PropertyKeyConst.AccessKey, "XXX");// 阿里云身份验证,在阿里云服务器管理控制台创建
properties.put(PropertyKeyConst.SecretKey, "XXX");// 阿里云身份验证,在阿里云服务器管理控制台创建
Producer producer = ONSFactory.createProducer(properties);
// 在发送消息前,必须调用 start 方法来启动 Producer,只需调用一次即可。
producer.start();
Message msg = new Message( //
// Message Topic
"Topic",
// Message Tag 可理解为 Gmail 中的标签,对消息进行再归类,方便 Consumer 指定过滤条件在 MQ 服务器过滤
"tag",
// Message Body 可以是任何二进制形式的数据, MQ 不做任何干预,需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
"Hello MQ".getBytes());
// 设置代表消息的业务关键属性,请尽可能全局唯一
// 以方便您在无法正常收到消息情况下,可通过 MQ 控制台查询消息并补发。
// 注意:不设置也不会影响消息正常收发
msg.setKey("ORDERID_100");
/**
* 定时消息投递,设置投递的具体时间戳,单位毫秒例如2016-03-07 16:21:00投递
*/
long timeStamp =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-03-07 16:21:00").getTime();
msg.setStartDeliverTime(timeStamp);
// 发送消息,只要不抛异常就是成功
SendResult sendResult = producer.send(msg);
System.out.println("Message Id:" + sendResult.getMessageId());
// 在应用退出前,销毁 Producer 对象
// 注意:如果不销毁也没有问题
producer.shutdown();
}
}
发送延时消息
public class ProducerDelayTest {
public static void main(String[] args) {
Properties properties = new Properties();
properties.put(PropertyKeyConst.ProducerId, "XXX");// 您在控制台创建的 Producer ID
properties.put(PropertyKeyConst.AccessKey, "XXX");// AccessKey 阿里云身份验证,在阿里云服务器管理控制台创建
properties.put(PropertyKeyConst.SecretKey, "XXX");// SecretKey 阿里云身份验证,在阿里云服务器管理控制台创建
Producer producer = ONSFactory.createProducer(properties);
// 在发送消息前,必须调用 start 方法来启动 Producer,只需调用一次即可。
producer.start();
Message msg = new Message( //
// Message Topic
"Topic",
// Message Tag, 可理解为 Gmail 中的标签,对消息进行再归类,方便 Consumer 指定过滤条件在 MQ 服务器过滤
"tag",
// Message Body 可以是任何二进制形式的数据, MQ 不做任何干预,需要 Producer 与 Consumer 协商好一致的序列化和反序列化方式
"Hello MQ".getBytes());
// 设置代表消息的业务关键属性,请尽可能全局唯一。
// 以方便您在无法正常收到消息情况下,可通过 MQ 控制台查询消息并补发。
// 注意:不设置也不会影响消息正常收发
msg.setKey("ORDERID_100");
// deliver time 单位 ms,指定一个时刻,在这个时刻之后才能被消费,这个例子表示 3s 后才能被消费
long delayTime = 3000;
msg.setStartDeliverTime(System.currentTimeMillis() + delayTime);
// 发送消息,只要不抛异常就是成功
SendResult sendResult = producer.send(msg);
System.out.println("Message Id:" + sendResult.getMessageId());
// 在应用退出前,销毁 Producer 对象
// 注意:如果不销毁也没有问题
producer.shutdown();
}
}
注意事项
- 定时/延时消息 msg.setStartDeliverTime 的参数需要设置成当前时间戳之后的某个时刻(单位毫秒),如果被设置成当前时间戳之前的某个时刻,消息将立刻投递给消费者。
- 定时/延时消息 msg.setStartDeliverTime 的参数可设置40天内的任何时刻(单位毫秒),超过40天消息发送将失败。
- 消费者存在消息堆积时,定时/延时消息将不能严格按照配置的时间进行消费。
最后更新:2016-11-23 16:04:16
上一篇:
集群消费和广播消费__特色功能_消息队列 MQ-阿里云
下一篇:
发布订阅管理__控制台使用指南_消息队列 MQ-阿里云
云服务器 ECS 变配(升级或降级)
GetBucketLifecycle__关于Bucket的操作_API 参考_对象存储 OSS-阿里云
重置账号__账号管理_API 参考_云数据库 RDS 版-阿里云
检测IP信息__辅助工具接口_API 手册_CDN-阿里云
查询应用加固结果接口__应用加固API_API手册_移动安全-阿里云
查询消息轨迹__消息轨迹_控制台使用指南_消息队列 MQ-阿里云
企业邮箱在Android(安卓)系统手机上POP3/IMAP协议的设置方法__客户端使用_邮箱常见问题_企业邮箱-阿里云
测试监控__性能测试技术体系_性能测试体系_性能测试-阿里云
Topic管理__产品管理_控制台使用手册_阿里云物联网套件-阿里云
部署和接入__产品简介_推荐引擎-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云