1. 程式人生 > >15天自動收貨,30分鐘不支付訂單自動取消是如何實現的?

15天自動收貨,30分鐘不支付訂單自動取消是如何實現的?



(1)使用者支付完成以後,把訂單ID插入到記憶體的一個DelayQueue中,同時插入到Redis中。

(2)15天之內,使用者點選了確認收貨,則從DelayQueue中刪除,從Redis中刪除。

(3)超過7天,DelayQueue中的訂單ID出隊,查詢資料庫,改狀態為自動收貨,刪除redis。

(4)如果15天之內,web伺服器重啟過,則web伺服器啟動以後,從redis中讀取待收貨的訂單,插入到DelayQueue。

看下具體的程式碼:

  1. @Controller
  2. @RequestMapping(value = "")  
  3. publicclass OrderController {  
  4.     @Autowired
  5.     DelayService delayService;  
  6.     @Autowired
  7.     RedisService redisServie;  
  8.     @Autowired
  9.     ConfigService configService;  
  10.     //模擬資料庫
  11.     private List<Long> ordeIds = new ArrayList<Long>();  
  12.     privatestaticfinal Logger log = Logger.getLogger(OrderController.class);  
  13.     @RequestMapping
    (value = "/order", method = RequestMethod.GET)  
  14.     public String order(final HttpServletRequest request, final Model model) {  
  15.         return"order";  
  16.     }  
  17.     @RequestMapping(value = "/pay", method = RequestMethod.GET)  
  18.     @ResponseBody
  19.     public Response<Void> pay(final HttpServletRequest request, 
    final Model model) {  
  20.         finallong orderId = Long.parseLong(request.getParameter("orderId"));  
  21.         ordeIds.add(orderId);  
  22.         log.error("訂單已支付:"+orderId);  
  23.         //把訂單插入到待收貨的佇列和redis
  24.         ThreadPoolUtil.execute(new Runnable(){  
  25.             @Override
  26.             publicvoid run() {  
  27.                 //1 插入到待收貨佇列
  28.                 DSHOrder dshOrder = new DSHOrder(orderId, configService.getDshTimeOut());  
  29.                 delayService.add(dshOrder);  
  30.                 log.error("訂單入隊:"+orderId);  
  31.                 //2插入到redis
  32.                 redisServie.set(Constants.RedisKey.DSH_PREFIX+orderId, dshOrder, RedisService.DB.DSH);  
  33.                 log.error("訂單入redis:"+orderId);  
  34.             }  
  35.         });  
  36.         returnnew Response<Void>(0,"成功");  
  37.     }  
  38.     @RequestMapping(value = "/confirm_delivery", method = RequestMethod.GET)  
  39.     @ResponseBody
  40.     public Response<Void> confirm_delivery(final HttpServletRequest request, final Model model) {  
  41.         finallong orderId = Long.parseLong(request.getParameter("orderId"));  
  42.         ordeIds.remove(orderId);  
  43.         log.error("訂單已確認收貨:"+orderId);  
  44.         //從delay佇列刪除,從redis刪除
  45.         ThreadPoolUtil.execute(new Runnable(){  
  46.             publicvoid run(){  
  47.                 //從delay佇列刪除
  48.                 delayService.remove(orderId);  
  49.                 log.error("訂單手動出隊:"+orderId);  
  50.                 //從redis刪除
  51.                 redisServie.delete(Constants.RedisKey.DSH_PREFIX+orderId, RedisService.DB.DSH);  
  52.                 log.error("訂單手動出redis:"+orderId);  
  53.             }  
  54.         });  
  55.         returnnew Response<Void>(0,"成功");  
  56.     }  
  57. }  

  1. @Service
  2. publicclass DelayService {  
  3.     privatestaticfinal Logger log = Logger.getLogger(DelayService.class);  
  4.     @Autowired
  5.     ConfigService configService;  
  6.     privateboolean start ;    
  7.     private OnDelayedListener listener;  
  8.     private DelayQueue<DSHOrder> delayQueue = new DelayQueue<DSHOrder>();  
  9.     publicstaticinterface OnDelayedListener{  
  10.         publicvoid onDelayedArrived(DSHOrder order);  
  11.     }  
  12.     publicvoid start(OnDelayedListener listener){  
  13.         if(start){  
  14.             return;  
  15.         }  
  16.         log.error("DelayService 啟動");  
  17.         start = true;  
  18.         this.listener = listener;  
  19.         new Thread(new Runnable(){  
  20.             publicvoid run(){  
  21.                 try{  
  22.                     while(true){  
  23.                         DSHOrder order = delayQueue.take();  
  24.                         if(DelayService.this.listener != null){  
  25.                             DelayService.this.listener.onDelayedArrived(order);  
  26.                         }  
  27.                     }  
  28.                 }catch(Exception e){  
  29.                     e.printStackTrace();  
  30.                 }  
  31.             }  
  32.         }).start();;  
  33.     }  
  34.     publicvoid add(DSHOrder order){  
  35.         delayQueue.put(order);  
  36.     }  
  37.     publicboolean remove(DSHOrder order){  
  38.         return delayQueue.remove(order);  
  39.     }  
  40.     publicvoid add(long orderId){  
  41.         delayQueue.put(new DSHOrder(orderId, configService.getDshTimeOut()));  
  42.     }  
  43.     publicvoid remove(long orderId){  
  44.         DSHOrder[] array = delayQueue.toArray(new DSHOrder[]{});  
  45.         if(array == null || array.length <= 0){  
  46.             return;  
  47. 相關推薦

    15自動30分鐘支付訂單自動取消是如何實現的?

    (1)使用者支付完成以後,把訂單ID插入到記憶體的一個DelayQueue中,同時插入到Redis中。(2)15天之內,使用者點選了確認收貨,則從DelayQueue中刪除,從Redis中刪除。(3)超過7天,DelayQueue中的訂單ID出隊,查詢資料庫,改狀態為自動收貨

    7自動30分鐘支付訂單自動取消是如何實現的?

    1.我們以支付以後7天自動收貨為例來說明下: (1)使用者支付完成以後,把訂單ID插入到記憶體的一個DelayQueue中,同時插入到Redis中。 (2)7天之內,使用者點選了確認收貨,則從DelayQueue中刪除,從Redis中刪除。 (3)超過7天,DelayQue

    LaTeX新人教程30分鐘從完全陌生到基本入門[轉載]

    XA don fcc 過程 idt 咨詢 官網下載 恐懼感 尋找 LaTeX新人教程,30分鐘從完全陌生到基本入門[轉載] 2017-02-05 分類:TeX講義 閱讀(32514) 評論(0) 這是一篇老文了,前幾天看微博的時候看到的,文中的很多表達比較過激,思路還是

    通過“走後門”才得來的關註和贊賞15後的今天我來炫耀下成果

    fff 好文 有關 RM one 決心 ges http 產品 我的關註和贊賞是如何得來的 想必看過小魚兒前一篇文章的人都知道,我是如何開始走上在博客寫文這條路的。好歹也是博客“堂堂”一產品經理,好歹也是親自策劃關註和贊賞並看著TA們上線的,竟然沒有關註和贊賞。如一休刺激

    強化學習AI20分鐘可學會開自動駕駛汽車

    本文由人工智慧觀察編譯譯者:Sandy據外媒報道,來自英國的一組研究人員在短短20分鐘之內就教會

    每日一問 如果 WEB 測試 7 內免登陸15 內免登陸1 個月內免登陸測試要怎麼去測?

    首先確認三個實現的細節:1、日期計算時,時間是按照伺服器時間、資料庫時間還是使用者本機時間或者其他的計算的?2、免登入是怎麼實現的?是Cookie還是Session?3、計算是按照時分秒計算還是按照整天計算的?測試點:以7天為例1、選擇7天內免登入,登入後退出再次登入,是否免

    LaTeX新人教程30分鐘從完全陌生到基本入門

    1.LaTeX軟體的安裝和使用 方法A(自助):在MikTeX的官網下載免費的MikTeX編譯包並安裝。下載WinEdt(收費)或TexMaker(免費)等編輯介面軟體並安裝。 方法B(打包):在ctex.org下載ctex套裝(含MikTeX及WinEdt) 哈哈這一部分當然不包含在標題的30分鐘裡。 2.

    《旅行青蛙》登陸淘寶“帶馬雲差錢幹嘛選過氣手遊?

    旅行青蛙明天,5月9日《旅行青蛙》國內版將以“小遊戲”的形式登陸手機淘寶。結果,今天書樂就被北京商報和IT時報問了一輪又一輪,難道阿裏又一次想要做遊戲大佬嗎?《旅行青蛙》還能火嗎?答案很簡單,一定會火,只是火的方式不一樣了。以下是書樂的若幹分析,你看看對不對:一 旅行青蛙能帶貨,特產什麽的只是起手式?毫無疑問

    編寫一個程式獲取10個1至20的隨機數要求隨機數能重複(HashSet實現

    廢話不多說,直接上程式碼。 package cn.ketang.lianxi02; import java.util.HashSet; import java.util.Random; /** *

    淘寶京東信息中自動識別手機號、姓名、省市區

    reader 經緯度 nod val tostring pri location com matcher 最近工作需要,需要從一串字符串中識別出姓名,手機號和省市區,例如下面的一些字符串: 櫥之友,包衛貞,13600000000,浙江省寧波市,慈溪市,庵東鎮 杭州灣新區世

    Java中用sql語句顯示最近30每日登入量每日登入量並以echarts頁面統計出最近15登入量

    需求:Java中統計每日登入總數,頁面顯示最近30 天資料,並以條形統計圖形式顯示出來。效果圖(新手,歡迎指教)sql語句如下:步驟1.:按天數統計每日登入量select count(id) as 每天

    30分鐘掌握ES6/ES2015核心內容[上和下] 不錯的說

    還得 天下 span default es6 ava arguments nts http ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準。因為當前版本的ES6是在2015年發布的,所以又稱ECMAScript 2015。 也就是說,E

    15倒計時:深度學習高端講座免費聽最後200位贈教材名額!

    技術講座 深度學習 tensor 深度學習是對使用多層神經網絡過程進行機器學習的統稱。目前已經被應用到圖像識別,語音識別,自然語言處理,機器翻譯等場景並取得了很好的行業應用效果。由谷歌研發的新一代深度學習工具Tensor Flow,於2015年底正式向公眾開源。Tensor Flow技術是當前最值

    php 利用cookie設置用戶30分鐘未操作自動退出

    func 成功 color emp ase upper highlight 解密 tmpl 登陸控制器需要做的登陸成功把用戶ID等信息存入cookie: $this->systemSetKey(array(‘name‘=>$admin_info[‘admin_

    SQL語句來查詢今天、昨天、7內、30的數據經典!

    diff 指定 first 內容 輸出 har edi time nth ---恢復內容開始--- 今天的所有數據:select * from 表名 where DateDiff(dd,datetime類型字段,getdate())=0 昨天的所有數據:select *

    自動登陸已失敗多次,30分鐘內請手動登陸

    cnblogs post 衛士 失敗 spa 恢復 跳板 class 報錯 遠程登陸跳板機時,該電腦未加入域,遇到報錯:自動登陸已失敗多次,30分鐘內請手動登陸 本地登陸正常。 解決辦法:卸載跳板機上的360安全衛士,恢復正常。 自動登陸已失敗多次,30分鐘內請手動登陸

    請拿出30分鐘鉆研此文系統掌握java面試題分析技巧

    java 面試 架構師 談一談對MySQL InnoDB的認識 介紹: InnoDB引擎是MySQL數據庫的一個重要的存儲引擎,和其他存儲引擎相比,InnoDB引擎的優點是支持兼容ACID的事務(類似於PostgreSQL),以及參數完整性(有外鍵)等。現在Innobase實行雙認證授權.MySQ

    微信提前解封!微信號被封7/8/15/16/30/31/60怎麽提前解除

    社會 及其 帳號登錄 騰訊 方式 資金 產業 著作權 添加 微信個人帳號封號常見問題 微信是一個生活辦法。為了更好的協助你了解咱們在打造綠色、健康的互聯網生態環境上做出的盡力,咱們對微信個人帳號約束登錄辦理收拾如下常見問題與回答: 一、何種行為或狀況會導致微信個人帳號被封?

    java幾秒前分鐘幾小時前幾月前幾年前的實現

     程式碼下載:http://www.zuidaima.com/share/1562038902000640.htm package com.zuidaima; import java.text.ParseException; import java.text.SimpleDat

    用Python指令碼自動運營多個自媒體平臺寫稿坐等只告訴你原理

    使用此方法最低成本不超過120元/年,年收入根據你所選擇垂直行業和帳號多少以及哪些平臺來決定 我所說的最低成本是針對我而言來說的,辛苦點的可以做到0成本操作,喜歡冒險的總投入不會超過5000塊錢 首先第一步就是你要有自媒體帳號,帳號和平臺不限,根據你對平臺的理解來自行選擇使用那個平臺,