精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Redisson優(yōu)雅關(guān)閉訂單

開發(fā) 前端 Redis
針對于定時(shí)任務(wù)的這種缺陷,關(guān)閉訂單的這個(gè)需求大多依賴于延時(shí)任務(wù)來實(shí)現(xiàn),這里說明一下延時(shí)任務(wù)與定時(shí)任務(wù)的最大不同,定時(shí)任務(wù)有執(zhí)行周期的,而延時(shí)任務(wù)在某事件觸發(fā)后一段時(shí)間內(nèi)執(zhí)行,并沒有執(zhí)行周期。

[[394210]]

在支付系統(tǒng)中,訂單通常是具有時(shí)效性的,例如在下單30分鐘后如果還沒有完成支付,那么就要取消訂單,不能再執(zhí)行后續(xù)流程。說到這,可能大家的第一反應(yīng)是啟動一個(gè)定時(shí)任務(wù),來輪詢訂單的狀態(tài)是否完成了支付,如果超時(shí)還沒有完成,那么就去修改訂單的關(guān)閉字段。當(dāng)然,在數(shù)據(jù)量小的時(shí)候這么干沒什么問題,但是如果訂單的數(shù)量上來了,那么就會出現(xiàn)讀取數(shù)據(jù)的瓶頸,畢竟來一次全表掃描還是挺費(fèi)時(shí)的。

針對于定時(shí)任務(wù)的這種缺陷,關(guān)閉訂單的這個(gè)需求大多依賴于延時(shí)任務(wù)來實(shí)現(xiàn),這里說明一下延時(shí)任務(wù)與定時(shí)任務(wù)的最大不同,定時(shí)任務(wù)有執(zhí)行周期的,而延時(shí)任務(wù)在某事件觸發(fā)后一段時(shí)間內(nèi)執(zhí)行,并沒有執(zhí)行周期。

對于延時(shí)任務(wù),可能大家對于RabbitMQ的延時(shí)隊(duì)列會比較熟悉,用起來也是得心應(yīng)手,但是你是否知道使用Redis也能實(shí)現(xiàn)延時(shí)任務(wù)的功能呢,今天我們就來看看具體應(yīng)該如何實(shí)現(xiàn)。

使用Redis實(shí)現(xiàn)的延時(shí)隊(duì)列,需要借助Redisson的依賴:

  1. <dependency> 
  2.     <groupId>org.redisson</groupId> 
  3.     <artifactId>redisson-spring-boot-starter</artifactId> 
  4.     <version>3.10.7</version> 
  5. </dependency> 

首先實(shí)現(xiàn)往延時(shí)隊(duì)列中添加任務(wù)的方法,為了測試時(shí)方便,我們把延遲時(shí)間設(shè)為30秒。

  1. @Component 
  2. public class UnpaidOrderQueue { 
  3.     @Autowired 
  4.     RedissonClient redissonClient; 
  5.  
  6.     public void addUnpaid(String orderId){ 
  7.         RBlockingQueue<String> blockingFairQueue = redissonClient.getBlockingQueue("orderQueue"); 
  8.         RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue); 
  9.  
  10.         System.out.println(DateTime.now().toString(JodaUtil.HH_MM_SS)+" 添加任務(wù)到延時(shí)隊(duì)列"); 
  11.         delayedQueue.offer(orderId,30, TimeUnit.SECONDS); 
  12.     } 

添加一個(gè)對隊(duì)列的監(jiān)聽方法,通過實(shí)現(xiàn)CommandLineRunner接口,使它在springboot啟動時(shí)就開始執(zhí)行:

  1. @Component 
  2. public class QueueRunner implements CommandLineRunner { 
  3.     @Autowired 
  4.     private RedissonClient redissonClient; 
  5.  
  6.     @Autowired 
  7.     private OrderService orderService; 
  8.  
  9.     @Override 
  10.     public void run(String... args) throws Exception { 
  11.         new Thread(()->{ 
  12.             RBlockingQueue<String> blockingFairQueue = redissonClient.getBlockingQueue("orderQueue"); 
  13.             RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue); 
  14.             delayedQueue.offer(null, 1, TimeUnit.SECONDS); 
  15.             while (true){ 
  16.                 String orderId = null
  17.                 try { 
  18.                     orderId = blockingFairQueue.take(); 
  19.                 } catch (Exception e) { 
  20.                     continue
  21.                 } 
  22.                 if (orderId==null) { 
  23.                     continue
  24.                 } 
  25.                 System.out.println(String.format(DateTime.now().toString(JodaUtil.HH_MM_SS)+" 延時(shí)隊(duì)列收到:"+orderId)); 
  26.                 System.out.println(DateTime.now().toString(JodaUtil.HH_MM_SS)+" 檢測訂單是否完成支付"); 
  27.                 if (orderService.isTimeOut(orderId)) { 
  28.                     orderService.closeOrder(orderId); 
  29.                 } 
  30.             } 
  31.         }).start(); 
  32.     } 

在方法中,單獨(dú)啟動了一個(gè)線程來進(jìn)行監(jiān)聽,如果有任務(wù)進(jìn)入延時(shí)隊(duì)列,那么取到訂單號后,調(diào)用我們OrderService提供的檢測是否訂單過期的服務(wù),如果過期,那么執(zhí)行關(guān)閉訂單的操作。

創(chuàng)建簡單的OrderService用于測試,提供創(chuàng)建訂單,檢測超時(shí),關(guān)閉訂單方法:

  1. @Service 
  2. public class OrderService { 
  3.  
  4.     @Autowired 
  5.     UnpaidOrderQueue unpaidOrderQueue; 
  6.  
  7.     public void createOrder(String order){ 
  8.         System.out.println(DateTime.now().toString(JodaUtil.HH_MM_SS)+" 創(chuàng)建訂單:"+order); 
  9.         unpaidOrderQueue.addUnpaid(order); 
  10.     } 
  11.  
  12.     public boolean isTimeOut(String orderId){ 
  13.         return true
  14.     } 
  15.  
  16.     public void closeOrder(String orderId){ 
  17.         System.out.println(DateTime.now().toString(JodaUtil.HH_MM_SS)+ " 關(guān)閉訂單"); 
  18.     } 

執(zhí)行請求,看一下結(jié)果:

圖片

在訂單創(chuàng)建30秒后,檢測到延時(shí)隊(duì)列中有任務(wù)任務(wù),調(diào)用檢測超時(shí)方法檢測到訂單沒有完成后,自動關(guān)閉訂單。

除了上面這種延時(shí)隊(duì)列的方式外,Redisson還提供了另一種方式,也能優(yōu)雅的關(guān)閉訂單,方法很簡單,就是通過對將要過期的key值的監(jiān)聽。

創(chuàng)建一個(gè)類繼承KeyExpirationEventMessageListener,重寫其中的onMessage方法,就能實(shí)現(xiàn)對過期key的監(jiān)聽,一旦有緩存過期,就會調(diào)用其中的onMessage方法:

  1. @Component 
  2. public class RedisExpiredListener extends KeyExpirationEventMessageListener { 
  3.     public static final String UNPAID_PREFIX="unpaidOrder:"
  4.  
  5.     @Autowired 
  6.     OrderService orderService; 
  7.  
  8.     public RedisExpiredListener(RedisMessageListenerContainer listenerContainer) { 
  9.         super(listenerContainer); 
  10.     } 
  11.  
  12.     @Override 
  13.     public void onMessage(Message message, byte[] pattern) { 
  14.         String expiredKey = message.toString(); 
  15.         if (expiredKey.startsWith(UNPAID_PREFIX)){ 
  16.             System.out.println(DateTime.now().toString(JodaUtil.HH_MM_SS)+" " +expiredKey+"已過期"); 
  17.             orderService.closeOrder(expiredKey); 
  18.         } 
  19.     } 

因?yàn)榭赡軙泻芏鄈ey的過期事件,因此需要對訂單過期的key加上一個(gè)前綴,用來判斷過期的key是不是屬于訂單事件,如果是的話那么進(jìn)行關(guān)閉訂單操作。

再在寫一個(gè)測試接口,用于創(chuàng)建訂單和接收支付成功的回調(diào)結(jié)果:

  1. @RestController 
  2. @RequestMapping("order"
  3. public class TestController { 
  4.     @Autowired 
  5.     RedisTemplate redisTemplate; 
  6.  
  7.     @GetMapping("create"
  8.     public String setTemp(String id){ 
  9.         String orderId= RedisExpiredListener.UNPAID_PREFIX+id; 
  10.         System.out.println(DateTime.now().toString(JodaUtil.HH_MM_SS)+" 創(chuàng)建訂單:"+orderId); 
  11.         redisTemplate.opsForValue().set(orderId,orderId,30, TimeUnit.SECONDS); 
  12.         return id; 
  13.     } 
  14.  
  15.     @GetMapping("fallback"
  16.     public void successFallback(String id){ 
  17.         String orderId= RedisExpiredListener.UNPAID_PREFIX+id; 
  18.         redisTemplate.delete(orderId); 
  19.     } 

在訂單支付成功后,一般我們會收到第三方的一個(gè)支付成功的異步回調(diào)通知。如果支付完成后收到了這個(gè)回調(diào),那么我們主動刪除緩存的未支付訂單,那么也就不會監(jiān)聽到這個(gè)訂單的orderId的過期失效事件。

但是這種方式有一個(gè)弊端,就是只能監(jiān)聽到過期緩存的key,不能獲取到對應(yīng)的value。而通過延時(shí)隊(duì)列的方式,可以通過為RBlockingQueue添加泛型的方式,保存更多訂單的信息,例如直接將對象存進(jìn)隊(duì)列中:

  1. RBlockingQueue<OrderDTO> blockingFairQueue = redissonClient.getBlockingQueue("orderQueue"); 
  2. RDelayedQueue<OrderDTO> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue); 

這樣的話我們再從延時(shí)隊(duì)列中獲取的時(shí)候,能夠拿到更多我們需要的屬性。綜合以上兩種方式,監(jiān)聽過期更為簡單,但存在的一定的局限性,如果我們只需要對訂單進(jìn)行判斷的話那么功能也能夠滿足我們的需求,如果需要在過期時(shí)獲取更多的訂單屬性,那么使用延時(shí)隊(duì)列的方式則更為合適。究竟選擇哪種,就要看大家的業(yè)務(wù)場景了。

 

責(zé)任編輯:姜華 來源: 碼農(nóng)參上
相關(guān)推薦

2021-03-28 09:17:18

JVM場景鉤子函數(shù)

2020-10-21 09:25:01

互聯(lián)網(wǎng)訂單自動關(guān)閉

2025-08-01 04:10:00

RocketMQ訂單分布式

2021-01-19 10:35:49

JVM場景函數(shù)

2025-01-13 06:00:00

Go語言gRPC

2017-12-19 10:03:44

JavaLinux代碼

2024-11-13 16:37:00

Java線程池

2022-04-11 08:17:07

JVMJava進(jìn)程

2024-09-05 09:10:07

2025-06-30 07:10:00

JavaJVM線程

2021-12-06 09:57:25

容器Linux信號

2025-02-12 00:21:44

Java并發(fā)編程

2017-07-26 11:32:50

NETRabbitMQ系統(tǒng)集成

2015-11-26 10:53:45

LinuxWindowsMac OS

2023-12-20 10:04:45

線程池Java

2021-08-10 07:41:24

ContextWaitGroupGoroutine

2021-11-17 10:25:28

loguru日志Python

2021-11-23 10:45:57

StopWatch代碼Java

2023-06-28 08:25:14

事務(wù)SQL語句

2023-06-16 09:08:39

ReactContextRFC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国内精品久久久久久久影视简单 | 国产精品加勒比| 国产传媒免费在线观看| 国产一区二区高清在线| 亚洲高清视频中文字幕| 欧美成人免费在线| 一级特黄aa大片| 99精品全国免费观看视频软件| 日韩欧美色综合网站| 噜噜噜久久亚洲精品国产品麻豆 | 久久久久久久久久电影| 国产精品欧美风情| 国产小视频在线观看免费| 亚洲区小说区图片区qvod| 欧美日韩久久一区二区| 3d动漫一区二区三区| www在线播放| 福利电影一区二区三区| 国产欧美日韩中文字幕| 日产精品久久久久久久| 天天av综合| 亚洲欧美日韩中文在线| 亚洲熟妇一区二区| 国产精品久久久久77777丨| 午夜成人在线视频| 久久久国产精华液999999| 日韩a在线观看| 国产成人免费在线观看不卡| 国产精品一区专区欧美日韩| 日韩一区二区视频在线| 欧美久色视频| 大量国产精品视频| 三级黄色片在线观看| 亚洲日产av中文字幕| 欧美成人一区二区三区在线观看| 在线观看av日韩| 久草在线中文最新视频| 夜夜嗨av一区二区三区中文字幕 | 日本一本在线视频| 亚洲人免费短视频| 精品国产乱码久久久久酒店| 91免费版看片| 精品51国产黑色丝袜高跟鞋| 国产拍揄自揄精品视频麻豆| 欧美另类一区| 婷婷伊人综合中文字幕| 国产99一区视频免费| 川上优av一区二区线观看| 特级西西444www大胆免费看| 久久蜜桃资源一区二区老牛| 欧美一区二区视频97| 亚洲国产成人精品激情在线| 亚洲视频狠狠| 久久久久国产视频| 久久久全国免费视频| 欧美另类亚洲| 久久人人97超碰精品888| 青青草手机在线视频| 亚洲综合久久av一区二区三区| 黄av在线播放| 亚洲三级在线观看| 中文字幕中文字幕在线中一区高清 | 91视频免费在线观看| 在线免费观看高清视频| 蜜臀av性久久久久蜜臀aⅴ| 欧美亚洲视频在线看网址| 欧美精品99久久久| 欧美超碰在线| 久久久精品网站| 国产探花在线免费观看| 午夜欧美精品| 久久免费视频这里只有精品| 国产精品成人av久久| 99国产精品| 欧美在线视频导航| 91在线视频免费播放| 久热精品视频| 国产精品自拍网| 国产精品爽爽久久| 国产高清精品久久久久| 国产精品对白一区二区三区| 午夜视频福利在线| 久久久亚洲午夜电影| 亚洲看片网站| 中文字幕在线观看播放| 亚洲电影激情视频网站| 免费看的黄色大片| 欧美一级二级视频| 在线成人免费视频| 亚洲美女在线播放| 国产99精品一区| 俺也去精品视频在线观看| 青娱乐免费在线视频| 在线一区免费观看| 国产精品中文字幕久久久| 性一交一乱一伧老太| 91一区二区在线观看| 日韩一区二区电影在线观看| 国产精品va在线观看视色| 午夜精品久久久久久久蜜桃app| 免费大片在线观看| 国产精品一区二区美女视频免费看| 精品日韩在线一区| 天天操天天干天天操天天干| 亚洲欧美亚洲| 国产精品美女网站| 欧美一区二不卡视频| 国产日韩一级二级三级| 国产一区 在线播放| 日本成人伦理电影| 精品国产麻豆免费人成网站| 久久久久亚洲AV成人无在| 韩国在线视频一区| 国产精品一区二区3区| 亚洲第一页视频| 国产精品久久久久精k8| 69堂免费视频| 综合激情久久| 日韩中文在线中文网在线观看| 国产一卡二卡在线播放| 久久成人免费日本黄色| 精品网站在线看| 成人日日夜夜| 欧美日韩在线播放三区| 91av在线免费| 欧美黄色大片网站| 国产精品揄拍一区二区| 日本天堂在线| 亚洲成人av一区二区| www.成年人| 欧美精选视频在线观看| 97在线看福利| 亚洲国产成人一区二区| 亚洲三级在线看| a在线观看免费视频| 蜜桃一区二区三区| 91禁外国网站| 成人午夜视频一区二区播放| 亚洲欧洲国产专区| a在线观看免费视频| 免费视频国产一区| 欧美最猛性xxxxx亚洲精品| 亚洲产国偷v产偷v自拍涩爱| 日韩毛片一二三区| 亚洲天堂2018av| 欧美理论电影大全| 国产精品盗摄久久久| 男人久久精品| 色婷婷精品久久二区二区蜜臀av| 菠萝菠萝蜜网站| 99国产精品久久久久久久| 国产一区不卡在线观看| 1区2区3区在线| 亚洲第一福利网站| 日本五十熟hd丰满| 不卡一区二区在线| 无码播放一区二区三区| 亚洲+小说+欧美+激情+另类| 青青精品视频播放| 国产永久免费高清在线观看 | 一级片在线观看视频| 国产精品国产三级国产aⅴ无密码| 久热免费在线观看| 亚洲精品一级二级三级| 国产成人精品久久久| 国产在线视频资源| 欧美日本在线播放| 91视频免费在线看| 不卡欧美aaaaa| 日韩欧美一区二区久久婷婷| 992tv人人草| 欧美日韩国产一区精品一区| 国产精品久久久久久久久婷婷 | 亚洲欧美自偷自拍| 欧美性感美女h网站在线观看免费| 91网站免费入口| 另类欧美日韩国产在线| 超薄肉色丝袜足j调教99| 91精品尤物| 欧洲成人免费视频| 337p日本欧洲亚洲大胆鲁鲁| 91精品综合久久久久久| 欧美日韩国产精品综合| 91网页版在线| 亚欧美在线观看| 欧美精品色网| 欧美一级片免费观看| 香蕉成人在线| 97人人模人人爽人人喊中文字| 狠狠狠综合7777久夜色撩人| 51午夜精品国产| 成年人免费看毛片| 中文字幕精品在线不卡| 亚洲欧美激情一区二区三区| 宅男噜噜噜66一区二区 | 国产二区视频在线观看| 欧美乱妇一区二区三区不卡视频| 久久久久久福利| 国产亚洲精品超碰| 乱码一区二区三区| 日韩和欧美一区二区| 99re6这里有精品热视频| 天堂俺去俺来也www久久婷婷| 国产欧美最新羞羞视频在线观看| 久草在线视频福利| 中文字幕一区二区精品| 黄色av免费观看| 欧美日韩在线精品一区二区三区激情 | 国产免费av观看| 精品久久久久久久中文字幕| 亚洲欧美精品久久| 久久综合九色综合欧美98| xxx中文字幕| 日本不卡一区二区| av日韩一区二区三区| 99久久亚洲精品蜜臀| 蜜桃精品久久久久久久免费影院| 欧美影院在线| 国产日本欧美一区| 激情都市亚洲| 国语对白做受69| 2020国产在线视频| 影音先锋日韩有码| 天堂av在线免费观看| 欧美刺激午夜性久久久久久久| 亚洲一区二区天堂| 91国内精品野花午夜精品| 91精品国产高潮对白| 中文字幕一区在线观看视频| 免费黄色在线视频| 99re这里只有精品视频首页| 91精品国产高清91久久久久久| 久久精品久久久精品美女| 北条麻妃在线一区| 久久成人免费| 1024av视频| 99国产精品私拍| 缅甸午夜性猛交xxxx| 欧美午夜一区| 国产欧美久久久久| 欧美日韩网址| www.18av.com| 国产精品mm| wwwwww欧美| 红桃视频欧美| 日本手机在线视频| 黄色日韩在线| 你真棒插曲来救救我在线观看| 欧美午夜视频| 男女啪啪免费视频网站| 亚洲麻豆一区| 干日本少妇首页| 国产一区白浆| 男人舔女人下面高潮视频| 亚洲三级影院| 欧美色图另类小说| 麻豆久久精品| 中文久久久久久| 久久av老司机精品网站导航| 成年网站免费在线观看| 国产精品资源在线观看| 国产男女无遮挡猛进猛出| 国产精品一区久久久久| 精品久久久久久无码人妻| kk眼镜猥琐国模调教系列一区二区| 国产精品九九视频| 久久综合五月天婷婷伊人| 免费看黄色的视频| 国产精品久久久99| 麻豆精品一区二区三区视频| 亚洲综合色婷婷| 国产成人亚洲欧洲在线| 欧美视频一二三| 中文字幕有码视频| 日韩三级中文字幕| 天天操天天射天天舔| 亚洲日韩中文字幕在线播放| 91福利在线视频| 久久夜色精品国产欧美乱| 国产黄色大片在线观看| 欧美一区视频在线| 91麻豆精品国产综合久久久| 国产精品成人观看视频免费| 国产一区二区三区电影在线观看| 吴梦梦av在线| 亚洲理论在线| 五月激情五月婷婷| 成人av免费在线观看| 亚洲一区二区三区日韩| 亚洲精品视频在线看| 色网站在线播放| 欧美精选午夜久久久乱码6080| 成人午夜福利视频| 综合136福利视频在线| 女囚岛在线观看| 国产精品极品美女在线观看免费| 精品国产乱码一区二区三区| 欧美高清视频一区| 综合天堂久久久久久久| 欧美女人性生活视频| 国产在线一区二区| 尤物视频最新网址| 一区二区三区四区乱视频| 精品免费囯产一区二区三区| 日韩一区二区三区四区五区六区| 日本aaa在线观看| 欧美精品xxx| 四虎影视成人精品国库在线观看 | 成人免费在线播放| 人人妻人人做人人爽| 久久99精品久久久久久动态图 | 中文字幕不卡三区| 中文字幕在线观看免费视频| 欧美精品九九99久久| 四虎影视在线观看2413| 久久99热精品| 激情久久99| 日本不卡一二三区| 在线亚洲观看| 日本五十肥熟交尾| 尤物视频一区二区| 国产精品无码免费播放| 夜夜嗨av一区二区三区四区 | 国产乱肥老妇国产一区二 | 日韩精品视频在线播放| 怡红院在线播放| 成人久久18免费网站图片| 九九视频免费观看视频精品| 精品无码国模私拍视频| 国产高清在线精品| 久久免费看少妇高潮v片特黄| 欧美视频第二页| 九色在线观看| 91福利视频网| 国内自拍欧美| 久久久久久人妻一区二区三区| 国产一区视频导航| 免费成人深夜夜行网站| 欧美裸体一区二区三区| 伊人免费在线| 国产精品久久久久久亚洲调教| 亚洲最大在线| 免费在线观看毛片网站| 99v久久综合狠狠综合久久| 久久精品性爱视频| 欧美mv和日韩mv国产网站| 亚洲91av| 成人在线免费观看一区| 亚洲天堂偷拍| 中文字幕精品久久久| 午夜精品久久久久久久99水蜜桃 | 免费观看性欧美大片无片| 亚洲国产精品女人| 国产一区二区导航在线播放| 欧美丰满熟妇bbbbbb| 日韩写真欧美这视频| 欧美人与性动交α欧美精品济南到| eeuss一区二区三区| 伊人成人在线视频| 亚洲午夜久久久久久久久红桃| 欧美午夜精品久久久久久浪潮| 毛片在线播放网站| 国产伦精品免费视频| 亚洲电影影音先锋| 美女流白浆视频| 午夜视频在线观看一区二区| 香蕉视频黄在线观看| 日韩免费黄色av| 久久中文字幕二区| 佐佐木明希电影| 精品久久久久久电影| 精品av中文字幕在线毛片| 成人黄色短视频在线观看| 欧美精品91| 欧美做受喷浆在线观看| 欧美天堂亚洲电影院在线播放| 久久久久久国产精品免费无遮挡| 成人欧美一区二区| 夜久久久久久| 亚洲av无一区二区三区| 精品日韩成人av| 日韩伦理三区| 黄色网络在线观看| 久久综合色天天久久综合图片| 亚洲天堂网在线观看视频| 久久久久久欧美| 欧美精品一区二区三区中文字幕| wwwxxxx在线观看| 一本色道综合亚洲| а√资源新版在线天堂| 久久综合狠狠综合久久综青草| 蜜臀久久久久久久| 国产大片中文字幕在线观看| 亚洲视频一区二区| 久久av网站| 亚洲五月天综合| 一区二区三区不卡视频| 高清毛片在线看| 国产精品三区在线| 久久精品国产久精国产|