精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

国产97免费视| 欧美日韩性生活| 久久爱av电影| 国内av在线播放| 91精品观看| 欧美一个色资源| 欧美 日韩精品| 在线看av的网址| 成人精品高清在线| 国产日韩精品在线播放| 国产精品第九页| 成人情趣视频| 日韩一本二本av| 日韩一级在线免费观看| 伊人影院在线视频| 国产日韩欧美激情| 成人在线免费观看一区| 中文在线观看av| 亚洲国产网站| 久久精品最新地址| 久久一区二区电影| 日韩精品久久久久久久软件91| 欧美日韩中文字幕| 300部国产真实乱| av大全在线免费看| 91视频在线观看免费| 91在线观看免费高清完整版在线观看| 羞羞影院体验区| 欧美激情aⅴ一区二区三区| 亚洲欧美在线一区| 国产在线不卡av| 国产一精品一av一免费爽爽| 在线看国产一区| 欧美日韩一道本| 尤物视频在线看| ㊣最新国产の精品bt伙计久久| 免费国产在线精品一区二区三区| 国产成人毛毛毛片| 寂寞少妇一区二区三区| 国产精品久久9| av网站中文字幕| 日韩网站在线| 久久免费视频在线观看| 欧美片一区二区| 欧美伦理在线视频| 亚洲欧美精品suv| 熟女人妻在线视频| 美女福利一区| 日韩精品丝袜在线| 天天躁日日躁狠狠躁av| 亚洲超碰在线观看| 欧美不卡一区二区三区四区| 国产精品igao网网址不卡| 成人做爰视频www| 欧美色视频一区| 中文字幕第36页| 欧美黄色成人| 欧美裸体bbwbbwbbw| av亚洲天堂网| 电影91久久久| 日韩一区二区三区观看| 青青草精品在线| 日韩视频1区| 欧美成人video| 男人网站在线观看| 亚洲妇女av| 亚洲人成电影在线观看天堂色| 欧美 日本 国产| 国产欧美一区二区精品久久久| 亚洲色图第一页| 欧美黄色一级生活片| 欧美熟乱15p| 久久精品国产精品| 久久久久亚洲AV成人| 亚洲高清二区| 日韩av免费看网站| 夜夜骚av一区二区三区| 国产一区二区三区黄视频| 99在线高清视频在线播放| 黄色成人一级片| 久久久精品tv| 一区二区三区四区欧美| 久久av色综合| 色婷婷av一区二区三区大白胸| 国产主播中文字幕| 久久gogo国模啪啪裸体| 亚洲加勒比久久88色综合| 亚洲熟妇无码av| 国产高清欧美| 97免费在线视频| 无码视频一区二区三区| 国产一区二区三区久久久| 精品无人区一区二区三区| 波多野结衣在线影院| 亚洲日本电影在线| 777久久久精品一区二区三区| 韩国女主播一区二区| 日韩一区二区三区视频在线| 亚洲国产综合视频| 国产美女喷水视频| 日本精品国产| 亚洲福利在线视频| 色一情一交一乱一区二区三区 | 国产成人精品一区二区在线| japanese国产在线观看| 国产成人精品亚洲777人妖| 麻豆传媒一区二区| 欧美成人精品一区二区男人看| 亚洲综合色区另类av| av无码精品一区二区三区| 另类视频一区二区三区| 亚洲丝袜在线视频| 久久久久亚洲AV| 强制捆绑调教一区二区| 狠狠色噜噜狠狠色综合久 | 久久九九热re6这里有精品| 亚洲视频一区二区| 国产精彩视频在线| 久久超碰97中文字幕| 欧美黑人xxxxx| 黑人另类精品××××性爽| 欧美体内she精视频| 好吊色视频一区二区三区| 日韩成人免费| 日本电影亚洲天堂| 老牛影视av牛牛影视av| 成人欧美一区二区三区黑人麻豆| 日本wwww视频| 成人在线视频你懂的| 久久视频国产精品免费视频在线| 手机在线看片1024| 成人白浆超碰人人人人| 浴室偷拍美女洗澡456在线| 成人激情视屏| 亚洲欧美制服综合另类| www.国产成人| 成人爽a毛片一区二区免费| 日韩人妻精品一区二区三区| 88xx成人网| 国产香蕉精品视频一区二区三区| 精品成人免费视频| 99re这里都是精品| 人体内射精一区二区三区| 亚洲一区二区三区日本久久九| xxxxxxxxx欧美| 一级特黄aaaaaa大片| 国产日产欧产精品推荐色| 日本中文字幕片| 亚洲人成精品久久久| 欧美重口另类videos人妖| 熟妇高潮一区二区三区| 亚洲va欧美va国产va天堂影院| 亚洲视频天天射| 影音先锋一区| 国产一区二区三区无遮挡| caoprom在线| 欧美精品一区二区三区四区 | 色综合咪咪久久| 偷拍女澡堂一区二区三区| 性娇小13――14欧美| 欧美性bbwbbwbbwhd| 日本成人片在线| 在线播放国产精品| 一区二区三区精| 亚洲免费伊人电影| 国内自拍偷拍视频| 亚洲永久网站| 亚洲.欧美.日本.国产综合在线| 99久久er| 美女性感视频久久久| 成人黄色在线观看视频| 午夜欧美在线一二页| 成人精品在线观看视频| 日韩在线一区二区| 青青草免费在线视频观看| www.久久东京| 韩国欧美亚洲国产| 国产专区在线播放| 欧美精品丝袜久久久中文字幕| 日韩成人毛片视频| av激情综合网| 人人干人人干人人| 一区二区中文字| 精品久久蜜桃| 男人亚洲天堂| 久久久久这里只有精品| 国产在线观看精品一区| 777午夜精品免费视频| 国产午夜视频在线| 国产三级久久久| 日本一区二区三区在线免费观看| 亚洲作爱视频| 亚洲日本无吗高清不卡| av自拍一区| 国产精品视频资源| av漫画网站在线观看| 一区二区亚洲欧洲国产日韩| 精品乱子伦一区二区| 一本色道亚洲精品aⅴ| av成人免费网站| 久久久亚洲精品石原莉奈| 亚洲制服中文字幕| 亚洲免费网站| 精品国产一区二区三区无码| 国产精品免费不| 高清一区二区三区视频| 国产精品久久亚洲不卡| 亚州国产精品久久久| 麻豆系列在线观看| 亚洲欧洲中文天堂| 蜜桃视频污在线观看| 欧美日韩www| 精品不卡一区二区| 亚洲动漫第一页| 久久福利免费视频| 久久久国产午夜精品| 亚洲精品无码一区二区| 日韩在线观看视频一区二区| 神马电影久久| 国产精品亚洲综合| 亚洲a成人v| 国产精品久久久久久久av大片| 国产精品电影| 日韩在线免费高清视频| 国产中文字幕在线观看| 精品香蕉一区二区三区| 亚洲风情第一页| 欧美精品一级二级| 亚洲影视一区二区| 欧美在线影院一区二区| 黄色在线免费观看| 欧美日韩性视频| 日产精品久久久久久久| 亚洲图片欧美一区| 五月婷婷一区二区| 亚洲视频免费在线| 日本二区三区视频| 国产精品久久久久久妇女6080| 国产特级黄色录像| www亚洲一区| 成人免费av片| 久久午夜免费电影| 能免费看av的网站| 久久婷婷成人综合色| 我和岳m愉情xxxⅹ视频| 91麻豆国产精品久久| 亚洲国产精品无码久久久久高潮| 成人av在线电影| 在线免费观看污视频| 99久久免费国产| 亚洲第九十七页| 久久嫩草精品久久久久| 国产一二三四五区| 欧美国产日韩a欧美在线观看| 成人国产精品久久久网站| 国产日韩欧美精品在线| 亚洲激情图片网| 亚洲欧美在线aaa| 午夜激情福利网| 亚洲一区二区在线视频| 国产精品theporn动漫| 欧美日韩国产影院| 91精品国产高清一区二区三密臀| 色婷婷亚洲精品| 伊人成年综合网| 在线综合亚洲欧美在线视频| 国产日产亚洲系列最新| 精品少妇一区二区三区在线视频| 高清乱码毛片入口| 亚洲精品色婷婷福利天堂| se在线电影| 免费不卡在线观看av| heyzo高清在线| 国产成人精品综合| 国产精久久久| 国产一区喷水| 日韩av久操| 黄色成人在线免费观看| 99热免费精品| 91插插插插插插插插| 国产成人aaa| 中文字幕在线看高清电影| 中文字幕一区二区三区在线播放 | 亚洲不卡一区二区三区| 国产剧情在线视频| 91精品福利在线一区二区三区| 国产 欧美 自拍| 在线观看日韩欧美| 国产乱码在线| 国产精品三级美女白浆呻吟| 亚洲成av人片在线观看www| 欧美日韩综合网| 欧美搞黄网站| 色综合av综合无码综合网站| 美日韩一级片在线观看| 岛国av免费观看| 欧美韩日一区二区三区| 国产无码精品在线播放| 欧美日韩一区二区三区免费看| 精品国自产拍在线观看| 国产一区二区三区高清在线观看| 91精品久久| 国产成人综合av| 精品精品国产毛片在线看| 亚洲一卡二卡三卡| 午夜在线视频观看日韩17c| www激情五月| 欧美激情中文字幕一区二区| 久久亚洲精品大全| 欧美日韩精品二区第二页| 婷婷在线免费视频| 久久综合色88| 91久久久久久白丝白浆欲热蜜臀| 国产精品日韩一区二区 | 美女999久久久精品视频| 欧洲av不卡| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 黄网站app在线观看| 日本高清视频一区| 99久久婷婷国产综合精品青牛牛| 在线观看一区二区三区三州 | 国产精品第一视频| 久久亚洲道色| 视色,视色影院,视色影库,视色网| 肉色丝袜一区二区| 人妻丰满熟妇aⅴ无码| 亚洲国产精品久久久久秋霞影院 | 成人激情免费电影网址| 国内偷拍精品视频| 精品视频一区 二区 三区| 日本福利片在线| 91产国在线观看动作片喷水| 91蝌蚪精品视频| 亚洲av综合色区| 精品无码三级在线观看视频| 欧美自拍偷拍网| 欧美视频在线观看一区二区| 黄色的视频在线免费观看| 欧美亚洲另类在线| 日韩高清电影免费| 99精品在线免费视频| av亚洲产国偷v产偷v自拍| 日本少妇久久久| 亚洲精美色品网站| 午夜伦理福利在线| 九色一区二区| 免费一区视频| www.99热| 欧美丝袜丝nylons| 日韩黄色影院| 成人欧美在线视频| 一本精品一区二区三区| 91精品国产高清91久久久久久| 亚洲丝袜美腿综合| 91麻豆成人精品国产免费网站| 色黄久久久久久| 国产一区二区三区| 日本精品久久久久久久久久| 国产成a人亚洲精| 日本少妇毛茸茸高潮| 日韩电影免费观看中文字幕| 在线成人av观看| 日本免费高清不卡| 麻豆精品国产91久久久久久| 成年人网站在线观看视频| 欧美一级高清片| xxx.xxx欧美| 久久久久久99| 蜜桃视频在线一区| www.xxxx日本| 亚洲国产美女久久久久 | 91在线国产电影| 狠色狠色综合久久| 一区二区三区免费在线观看视频| 色一情一伦一子一伦一区| 91欧美在线视频| 亚洲xxxx在线| 国产精品亚洲综合久久| 国产不卡在线观看视频| 日韩丝袜情趣美女图片| 黄色在线免费观看网站| 涩涩涩999| 国产成人在线观看免费网站| 日韩不卡在线播放| 日韩一区视频在线| 国产精品毛片av| 午夜在线观看av| 亚洲成人一区在线| 成av人电影在线观看| 国产精品v欧美精品v日韩| 乱码第一页成人| 永久久久久久久| 亚洲精品视频在线播放| 狂野欧美性猛交xxxx| r级无码视频在线观看| 国产精品欧美一区二区三区| 国产综合视频在线| 国产精品入口日韩视频大尺度 | 欧美精品第三页| 亚洲精品精品亚洲|