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-阿裏雲