电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列的場(chǎng)景分析

瀏覽:124日期:2023-03-16 14:02:04
使用場(chǎng)景

1、下單成功,30分鐘未支付。支付超時(shí),自動(dòng)取消訂單

2、訂單簽收,簽收后7天未進(jìn)行評(píng)價(jià)。訂單超時(shí)未評(píng)價(jià),系統(tǒng)默認(rèn)好評(píng)

3、下單成功,商家5分鐘未接單,訂單取消

4、配送超時(shí),推送短信提醒

......

對(duì)于延時(shí)比較長(zhǎng)的場(chǎng)景、實(shí)時(shí)性不高的場(chǎng)景,我們可以采用任務(wù)調(diào)度的方式定時(shí)輪詢處理。如:xxl-job

今天我們采用一種比較簡(jiǎn)單、輕量級(jí)的方式,使用 Redis 的延遲隊(duì)列來(lái)進(jìn)行處理。當(dāng)然有更好的解決方案,可根據(jù)公司的技術(shù)選型和業(yè)務(wù)體系選擇最優(yōu)方案。如:使用消息中間件Kafka、RabbitMQ 的延遲隊(duì)列

先不討論其實(shí)現(xiàn)原理,直接實(shí)戰(zhàn)上代碼先實(shí)現(xiàn)基于 Redis 的延遲隊(duì)列

1、引入 Redisson 依賴

<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.10.5</version></dependency>

2、Nacos 配置 Redis 連接

spring: redis: host: 127.0.0.1 port: 6379 password: 123456 database: 12 timeout: 3000

3、創(chuàng)建 RedissonConfig 配置

/** * Created by LPB on 2020/04/20. */@Configurationpublic class RedissonConfig { @Value('${spring.redis.host}')private String host;@Value('${spring.redis.port}')private int port;@Value('${spring.redis.database}')private int database;@Value('${spring.redis.password}')private String password; @Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress('redis://' + host + ':' + port).setDatabase(database).setPassword(password);return Redisson.create(config);} }

4、封裝 Redis 延遲隊(duì)列工具類

/** * redis延遲隊(duì)列工具 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueUtil { @Autowiredprivate RedissonClient redissonClient; /** * 添加延遲隊(duì)列 * @param value 隊(duì)列值 * @param delay 延遲時(shí)間 * @param timeUnit 時(shí)間單位 * @param queueCode 隊(duì)列鍵 * @param <T> */ public <T> void addDelayQueue(T value, long delay, TimeUnit timeUnit, String queueCode){try { RBlockingDeque<Object> blockingDeque = redissonClient.getBlockingDeque(queueCode); RDelayedQueue<Object> delayedQueue = redissonClient.getDelayedQueue(blockingDeque); delayedQueue.offer(value, delay, timeUnit);log.info('(添加延時(shí)隊(duì)列成功) 隊(duì)列鍵:{},隊(duì)列值:{},延遲時(shí)間:{}', queueCode, value, timeUnit.toSeconds(delay) + '秒');} catch (Exception e) { log.error('(添加延時(shí)隊(duì)列失敗) {}', e.getMessage()); throw new RuntimeException('(添加延時(shí)隊(duì)列失敗)');} } /** * 獲取延遲隊(duì)列 * @param queueCode * @param <T> * @return * @throws InterruptedException */ public <T> T getDelayQueue(String queueCode) throws InterruptedException {RBlockingDeque<Map> blockingDeque = redissonClient.getBlockingDeque(queueCode);T value = (T) blockingDeque.take();return value;}}

5、創(chuàng)建延遲隊(duì)列業(yè)務(wù)枚舉

/** * 延遲隊(duì)列業(yè)務(wù)枚舉 * Created by LPB on 2021/04/20. */@Getter@NoArgsConstructor@AllArgsConstructorpublic enum RedisDelayQueueEnum { ORDER_PAYMENT_TIMEOUT('ORDER_PAYMENT_TIMEOUT','訂單支付超時(shí),自動(dòng)取消訂單', 'orderPaymentTimeout'),ORDER_TIMEOUT_NOT_EVALUATED('ORDER_TIMEOUT_NOT_EVALUATED', '訂單超時(shí)未評(píng)價(jià),系統(tǒng)默認(rèn)好評(píng)', 'orderTimeoutNotEvaluated'); /** * 延遲隊(duì)列 Redis Key */private String code; /** * 中文描述 */private String name; /** * 延遲隊(duì)列具體業(yè)務(wù)實(shí)現(xiàn)的 Bean * 可通過(guò) Spring 的上下文獲取 */private String beanId; }

6、定義延遲隊(duì)列執(zhí)行器

/** * 延遲隊(duì)列執(zhí)行器 * Created by LPB on 2021/04/20. */public interface RedisDelayQueueHandle<T> { void execute(T t); }

7、創(chuàng)建枚舉中定義的Bean,并實(shí)現(xiàn)延遲隊(duì)列執(zhí)行器 OrderPaymentTimeout:訂單支付超時(shí)延遲隊(duì)列處理類

/** * 訂單支付超時(shí)處理類 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderPaymentTimeout implements RedisDelayQueueHandle<Map> {@Overridepublic void execute(Map map) {log.info('(收到訂單支付超時(shí)延遲消息) {}', map);// TODO 訂單支付超時(shí),自動(dòng)取消訂單處理業(yè)務(wù)... }}

OrderTimeoutNotEvaluated:訂單超時(shí)未評(píng)價(jià)延遲隊(duì)列處理類

/** * 訂單超時(shí)未評(píng)價(jià)處理類 * Created by LPB on 2021/04/20. */@Component@Slf4jpublic class OrderTimeoutNotEvaluated implements RedisDelayQueueHandle<Map> {@Overridepublic void execute(Map map) {log.info('(收到訂單超時(shí)未評(píng)價(jià)延遲消息) {}', map);// TODO 訂單超時(shí)未評(píng)價(jià),系統(tǒng)默認(rèn)好評(píng)處理業(yè)務(wù)... }}

8、創(chuàng)建延遲隊(duì)列消費(fèi)線程,項(xiàng)目啟動(dòng)完成后開(kāi)啟

/** * 啟動(dòng)延遲隊(duì)列 * Created by LPB on 2021/04/20. */@Slf4j@Componentpublic class RedisDelayQueueRunner implements CommandLineRunner { @Autowiredprivate RedisDelayQueueUtil redisDelayQueueUtil; @Overridepublic void run(String... args) {new Thread(() -> {while (true){try {RedisDelayQueueEnum[] queueEnums = RedisDelayQueueEnum.values();for (RedisDelayQueueEnum queueEnum : queueEnums) {Object value = redisDelayQueueUtil.getDelayQueue(queueEnum.getCode());if (value != null) {RedisDelayQueueHandle redisDelayQueueHandle = SpringUtil.getBean(queueEnum.getBeanId());redisDelayQueueHandle.execute(value);}}} catch (InterruptedException e) {log.error('(Redis延遲隊(duì)列異常中斷) {}', e.getMessage());}}}).start();log.info('(Redis延遲隊(duì)列啟動(dòng)成功)');}}

以上步驟,Redis 延遲隊(duì)列核心代碼已經(jīng)完成,下面我們寫一個(gè)測(cè)試接口,用 PostMan 模擬測(cè)試一下

9、創(chuàng)建一個(gè)測(cè)試接口,模擬添加延遲隊(duì)列

/** * 延遲隊(duì)列測(cè)試 * Created by LPB on 2020/04/20. */@RestControllerpublic class RedisDelayQueueController { @Autowiredprivate RedisDelayQueueUtil redisDelayQueueUtil; @PostMapping('/addQueue')public void addQueue() {Map<String, String> map1 = new HashMap<>();map1.put('orderId', '100');map1.put('remark', '訂單支付超時(shí),自動(dòng)取消訂單'); Map<String, String> map2 = new HashMap<>();map2.put('orderId', '200');map2.put('remark', '訂單超時(shí)未評(píng)價(jià),系統(tǒng)默認(rèn)好評(píng)'); // 添加訂單支付超時(shí),自動(dòng)取消訂單延遲隊(duì)列。為了測(cè)試效果,延遲10秒鐘redisDelayQueueUtil.addDelayQueue(map1, 10, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_PAYMENT_TIMEOUT.getCode()); // 訂單超時(shí)未評(píng)價(jià),系統(tǒng)默認(rèn)好評(píng)。為了測(cè)試效果,延遲20秒鐘redisDelayQueueUtil.addDelayQueue(map2, 20, TimeUnit.SECONDS, RedisDelayQueueEnum.ORDER_TIMEOUT_NOT_EVALUATED.getCode());} }

10、啟動(dòng) SpringBoot 項(xiàng)目,用 PostMan 調(diào)用接口添加延遲隊(duì)列 通過(guò) Redis 客戶端可看到兩個(gè)延遲隊(duì)列已添加成功

SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列的場(chǎng)景分析

查看 IDEA 控制臺(tái)日志可看到延遲隊(duì)列已消費(fèi)成功

SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列的場(chǎng)景分析

到此這篇關(guān)于SpringBoot集成Redisson實(shí)現(xiàn)延遲隊(duì)列的文章就介紹到這了,更多相關(guān)SpringBoot Redisson延遲隊(duì)列內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 上海橡胶接头_弹簧减震器_金属软接头厂家-上海淞江集团 | 热闷罐-高温罐-钢渣热闷罐-山东鑫泰鑫智能热闷罐厂家 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 铝合金电阻-无源谐波滤波器-上海稳达电讯设备厂 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 泡沫消防车_水罐消防车_湖北江南专用特种汽车有限公司 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 重庆波纹管|重庆钢带管|重庆塑钢管|重庆联进管道有限公司 | 湖南自考_湖南自学考试| 至顶网| 自清洗过滤器_全自动过滤器_全自动反冲洗过滤器_量子过滤器-滑漮滴 | 沥青车辙成型机-车托式混凝土取芯机-混凝土塑料试模|鑫高仪器 | 密集柜_档案密集柜_智能密集架_密集柜厂家_密集架价格-智英伟业 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 土壤养分检测仪_肥料养分检测仪_土壤水分检测仪-山东莱恩德仪器 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 |