網站首頁 編程語言 正文
前言碎語
首先說明下需求,一個用戶中心產品,用戶在試用產品有三天的期限,三天到期后準時準點通知用戶,試用產品到期了。這個需求如果不是準時通知,而是每天定點通知就簡單了。如果需要準時通知就只能上延遲隊列了。使用場景除了如上,典型的業務場景還有電商中的延時未支付訂單失效等等。
延遲隊列多種實現方式
- 1.如基于RabbitMQ的隊列ttl+死信路由策略:通過設置一個隊列的超時未消費時間,配合死信路由策略,到達時間未消費后,回會將此消息路由到指定隊列
- 2.基于RabbitMQ延遲隊列插件(rabbitmq-delayed-message-exchange):發送消息時通過在請求頭添加延時參數(headers.put("x-delay",?5000))即可達到延遲隊列的效果
- 3.使用redis的zset有序性,輪詢zset中的每個元素,到點后將內容遷移至待消費的隊列,(redisson已有實現)
- 4.使用redis的key的過期通知策略,設置一個key的過期時間為延遲時間,過期后通知客戶端
redisson中的延遲隊列實現
怎么封裝便于業務使用。
1.首先定義一個延遲job,里面包含一個map參數,和隊列執行器的具體實現class,觸發任務執行時,map參數會被傳遞到具體的業務執行器實現內
/** * Created by kl on 2018/7/20. * Content :延時job */ public class DelayJob { private Map jobParams;//job執行參數 private Class aClass;//具體執行實例實現 }
2.定義一個延遲job執行器接口,業務需要實現這個接口,然后在execute方法內寫自己的業務邏輯
/** * Created by kl on 2018/7/20. * Content :延時job執行器接口 */ public interface ExecuteJob { void execute(DelayJob job); }
3.消費已經到點的延時job服務,通過job參數調用業務執行器實現
@Component public class JobTimer { static final String jobsTag = "customer_jobtimer_jobs"; @Autowired private RedissonClient client; @Autowired private ApplicationContext context; ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2); @PostConstruct public void startJobTimer() { RBlockingQueueblockingQueue = client.getBlockingQueue(jobsTag); new Thread() { @Override public void run() { while (true) { try { DelayJob job = blockingQueue.take(); executorService.execute(new ExecutorTask(context, job)); } catch (Exception e) { e.printStackTrace(); try { TimeUnit.SECONDS.sleep(60); } catch (Exception ex) { } } } } }.start(); } class ExecutorTask implements Runnable { private ApplicationContext context; private DelayJob delayJob; public ExecutorTask(ApplicationContext context, DelayJob delayJob) { this.context = context; this.delayJob = delayJob; } @Override public void run() { ExecuteJob service = (ExecuteJob) context.getBean(delayJob.getaClass()); service.execute(delayJob); } } }
4.封裝延時job服務
/** * Created by kl on 2018/7/20. * Content :延時job服務 */ @Component public class DelayJobService { @Autowired private RedissonClient client; public void submitJob(DelayJob job, Long delay, TimeUnit timeUnit){ RBlockingQueueblockingQueue = client.getBlockingQueue(JobTimer.jobsTag); RDelayedQueue delayedQueue = client.getDelayedQueue(blockingQueue); delayedQueue.offer(job,delay,timeUnit); } }
文末結語
原文鏈接:http://www.kailing.pub/article/index/arcid/207.html
相關推薦
- 2022-11-10 Kotlin?協程異步熱數據流的設計與使用講解_Android
- 2022-02-28 el-dialog 的關閉事件執行兩次
- 2022-03-17 golang?數組隨機排序的實現_Golang
- 2022-05-15 C++單例類宏定義,方便快速實現單例類
- 2023-06-19 圖文詳解Go中的channel_Golang
- 2022-12-07 React中路由的參數傳遞路由的配置文件詳解_React
- 2022-06-17 C#中Parallel類For、ForEach和Invoke使用介紹_C#教程
- 2022-05-22 小白也可以完成的0基礎部署Nginx服務_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支