91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么實現商城訂單超時取消功能

發布時間:2021-08-12 17:31:15 來源:億速云 閱讀:136 作者:Leah 欄目:編程語言

這篇文章將為大家詳細講解有關Java中怎么實現商城訂單超時取消功能,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

實現原理:

利用 jdk 的 DelayQueue的阻塞隊列的特性實現。在項目啟動時開啟一個線程處理 DelayQueue 隊列里彈出的超時訂單對象,訂單未超時該線程處于等待中。

DelayQueue的簡單介紹:

DelayQueue類的主要作用:是一個無界的BlockingQueue,用于放置實現了Delayed接口的對象,其中的對象只能在其到期時才能從隊列中取走。這種隊列是有序的,即隊頭對象的延遲到期時間最長。注意:不能將null元素放置到這種隊列中。

實現方式 :

1.創建一個實現Delayed接口的 order 類并重寫compareTo和 getDelay方法

2.創建一個幫助類OrderCollection(訂單的增刪查)

3. 創建CancellOrder類

在生成訂單時將訂單號創建時間和過期時間封裝成一個實現Delayed接口的對象存入DelayQueue隊列中,當該訂單支付完成后將該對象從隊列中移除,(為了保證不丟失訂單建議在項目啟動時將數據庫中的符合條件的訂單初始化到DelayQueue隊列中 )

實現代碼如下:

/** * 類說明 * * @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 已經過期  */  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日 新建 */@Componentpublic 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();      // 業務邏輯操作     } catch (InterruptedException e) {      e.printStackTrace();      log.error("CancellOrder DelayQueue 錯誤 {}", e.getMessage());     }   }  }}

關于Java中怎么實現商城訂單超時取消功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆云县| 崇文区| 南江县| 如东县| 监利县| 枣庄市| 泉州市| 武安市| 乌苏市| 平顶山市| 赣州市| 广河县| 城口县| 福建省| 兴义市| 鄂温| 临江市| 佛山市| 布尔津县| 龙南县| 清流县| 海阳市| 宜黄县| 寿阳县| 花莲市| 精河县| 红原县| 禹城市| 芦溪县| 扎鲁特旗| 汪清县| 曲麻莱县| 岐山县| 耒阳市| 巴彦县| 东乡族自治县| 徐水县| 独山县| 阿巴嘎旗| 河池市| 宜良县|