大多數(shù)的B2C商城項目都會有限時活動,當(dāng)用戶下單后都會有支付超時時間,當(dāng)訂單超時后訂單的狀態(tài)就會自動變成已取消 ,這個功能的實現(xiàn)有很多種方法,本文的實現(xiàn)方法適合大多數(shù)比較小的商城使用。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了密山免費建站歡迎大家使用!
實現(xiàn)原理:
利用 jdk 的 DelayQueue的阻塞隊列的特性實現(xiàn)。在項目啟動時開啟一個線程處理 DelayQueue 隊列里彈出的超時訂單對象,訂單未超時該線程處于等待中。
DelayQueue的簡單介紹:
DelayQueue類的主要作用:是一個無界的BlockingQueue,用于放置實現(xiàn)了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。這種隊列是有序的,即隊頭對象的延遲到期時間最長。注意:不能將null元素放置到這種隊列中。
實現(xiàn)方式 :
1.創(chuàng)建一個實現(xiàn)Delayed接口的 order 類并重寫compareTo和 getDelay方法
2.創(chuàng)建一個幫助類OrderCollection(訂單的增刪查)
3. 創(chuàng)建CancellOrder類
在生成訂單時將訂單號創(chuàng)建時間和過期時間封裝成一個實現(xiàn)Delayed接口的對象存入DelayQueue隊列中,當(dāng)該訂單支付完成后將該對象從隊列中移除,(為了保證不丟失訂單建議在項目啟動時將數(shù)據(jù)庫中的符合條件的訂單初始化到DelayQueue隊列中 )
實現(xiàn)代碼如下:
/** * 類說明 * * @author grl * @date 2019年12月16日 新建 */ public class Order implements Delayed { private String orderShopNum; /** * 1-普通活動 2-限時活動 3-拼購活動 */ private int orderType; private long orderCreateTime; private long expTime; public Order(String orderShopNum, int orderType, Date createTime) { if (StringUtils.isNotBlank(orderShopNum)) { this.orderShopNum = orderShopNum.trim(); } if (createTime == null) { this.orderCreateTime = System.currentTimeMillis(); } else { this.orderCreateTime = createTime.getTime(); } this.orderType = orderType; if (orderType == 2) { this.expTime = TimeUnit.MILLISECONDS.convert(Const.LIMIT_ACTIVITY_EXPIRATION_TIME, TimeUnit.MINUTES) + createTime.getTime(); }if(orderType == 3){ this.expTime = TimeUnit.MILLISECONDS.convert(Const.LIMIT_GROUP_BUY_EXPIRATION_TIME, TimeUnit.MINUTES) + createTime.getTime(); } else { this.expTime = TimeUnit.MILLISECONDS.convert(Const.ORDER_PAYMENT_DEADLINE, TimeUnit.DAYS) + createTime.getTime(); } } public String getOrderShopNum() { return orderShopNum; } public long getOrderCreateTime() { return orderCreateTime; } public long getExpTime() { return expTime; } public int getOrderType() { return orderType; } @Override public int compareTo(Delayed o) { return Long.valueOf(this.expTime).compareTo(Long.valueOf(((Order) o).expTime)); } @Override public long getDelay(TimeUnit unit) { return unit.convert(this.expTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } } /** * 類說明 * * @author grl * @date 2019年12月16日 新建 */ public class OrderCollection { /** * 訂單管理集合 */ private static DelayQueue<Order> orderList = new DelayQueue<Order>(); private OrderCollection() { } /** * 獲取訂單集合 * @author grl * @return */ protected static DelayQueue getOrderCollection() { return orderList; } /** * 向集合中添加訂單 * * @author grl * @param order * @return */ public static boolean add(Order order) { boolean flag = false; if (order != null && StringUtils.isNotBlank(order.getOrderShopNum())) { flag = orderList.offer(order); } return flag; } /** * 從集合中刪除訂單 * * @author grl * @param orderShopNum * @return */ public static boolean remove(String orderShopNum) { boolean flag = false; Order thisOrder = null; if (StringUtils.isNotBlank(orderShopNum)) { orderShopNum = orderShopNum.trim(); for (Order order : orderList) { String orderNum = order.getOrderShopNum(); if (orderNum.equals(orderShopNum)) { thisOrder = order; } } if (thisOrder != null) { flag = orderList.remove(thisOrder); } } return flag; } /** * 獲取訂單的過期剩余時間 * * @author grl * @param orderShopNum * @param unit * @return -1 已經(jīng)過期 */ public static long getDelay(String orderShopNum) { long time = -1; if (StringUtils.isNotBlank(orderShopNum)) { orderShopNum = orderShopNum.trim(); for (Order order : orderList) { String orderNum = order.getOrderShopNum(); if (orderNum.equals(orderShopNum)) { time = order.getDelay(TimeUnit.MILLISECONDS); if(time<5000) { time = -1; } } } } return time; } } /** * 類說明 * * @author grl * @date 2019年12月16日 新建 */ @Component public class CancellOrder implements Runnable { private static final Logger log = LoggerFactory.getLogger(CancellOrder.class); @Override public void run() { while (true) { try { Order take = OrderCollection.getOrderCollection().take(); String orderShopNum = take.getOrderShopNum(); int orderType = take.getOrderType(); // 業(yè)務(wù)邏輯操作 } catch (InterruptedException e) { e.printStackTrace(); log.error("CancellOrder DelayQueue 錯誤 {}", e.getMessage()); } } } }
總結(jié)
以上所述是小編給大家介紹的Java實現(xiàn)商城訂單超時取消功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
網(wǎng)站欄目:Java實現(xiàn)商城訂單超時取消功能
當(dāng)前鏈接:http://www.rwnh.cn/article34/gopgpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、用戶體驗、Google、品牌網(wǎng)站制作、網(wǎng)站制作、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)