rabbitmq實現延遲訊息(附原始碼)
阿新 • • 發佈:2018-11-05
rabbitmq實現延遲訊息的方案
1. 使用延時佇列
單機不考慮拓展的情況下,可以使用java.util.concurrent包的DelayQueue, 但插入的物件需實現Delayed介面,並實現其getDelay方法。
優點:針對任意訊息佇列均可使用
缺點:可拓展性差,編碼略複雜,可複用性不高
2.藉助ScheduledExecutorService非同步延時提交
廢話不多說,程式碼如下:
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.schedule(new Callable<String>() {
@Override
public String call() throws Exception {
try {
amqpTemplate.convertAndSend(MAIN_EXCHANGE, MAIN_ROUTING, JSON.toJSONString(t).getBytes(DEFAULT_CHARSET));
log.info("已經發送:" + new Date());
} catch (AmqpException e) {
} catch (Exception e) {
}
return "ok";
}
},time,unit);
優點:實現簡單,程式碼簡潔易懂
缺點:訊息量比較大的情況下,需要對ScheduledExecutorService的建立做優化,否則會造成效能的瓶頸
3.使用rabbitmq的ttl訊息和死信佇列實現
簡單來說,就是在傳送至指定exchange前建一個delayQueue,並繫結對應的delayExchange和路由,設定超時時間,並指定超時後死信佇列為目標佇列。當傳送至delayExchange的訊息始終無消費者進行消費時並且發生超時時,則會進入目標死信佇列,從而完成延遲訊息的實現. 官網rabbitmq延遲訊息實現說明
優點:可拓展性強,支援的併發數更高
缺點:理解上要麻煩一些,程式碼需要進行相應改造
最後說一句,程式碼已上傳至github, 歡迎有需要的小夥伴關注並下載~
rabbitmq-springboot