最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)商城訂單超時(shí)取消功能

 更新時(shí)間:2019年12月17日 11:50:00   作者:長路漫漫~Gavin  
大多數(shù)的B2C商城項(xiàng)目都會有限時(shí)活動,當(dāng)用戶下單后都會有支付超時(shí)時(shí)間,當(dāng)訂單超時(shí)后訂單的狀態(tài)就會自動變成已取消 ,這個(gè)功能的實(shí)現(xiàn)有很多種方法,本文的實(shí)現(xiàn)方法適合大多數(shù)比較小的商城使用。具體實(shí)現(xiàn)方式可以跟隨小編一起看看吧

 大多數(shù)的B2C商城項(xiàng)目都會有限時(shí)活動,當(dāng)用戶下單后都會有支付超時(shí)時(shí)間,當(dāng)訂單超時(shí)后訂單的狀態(tài)就會自動變成已取消 ,這個(gè)功能的實(shí)現(xiàn)有很多種方法,本文的實(shí)現(xiàn)方法適合大多數(shù)比較小的商城使用。

實(shí)現(xiàn)原理:

     利用 jdk 的 DelayQueue的阻塞隊(duì)列的特性實(shí)現(xiàn)。在項(xiàng)目啟動時(shí)開啟一個(gè)線程處理 DelayQueue 隊(duì)列里彈出的超時(shí)訂單對象,訂單未超時(shí)該線程處于等待中。

DelayQueue的簡單介紹:

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

實(shí)現(xiàn)方式 :

  1.創(chuàng)建一個(gè)實(shí)現(xiàn)Delayed接口的 order 類并重寫compareTo和 getDelay方法

  2.創(chuàng)建一個(gè)幫助類OrderCollection(訂單的增刪查)

  3. 創(chuàng)建CancellOrder類

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

實(shí)現(xiàn)代碼如下:

/**
 * 類說明
 *
 * @author grl
 * @date 2019年12月16日 新建
 */
public class Order implements Delayed {
  private String orderShopNum;
  /**
  * 1-普通活動 2-限時(shí)活動 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;
  }
  /**
  * 獲取訂單的過期剩余時(shí)間
  * 
  * @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 錯(cuò)誤 {}", e.getMessage());
     }
   }
  }
}

總結(jié)

以上所述是小編給大家介紹的Java實(shí)現(xiàn)商城訂單超時(shí)取消功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Java多態(tài)用法與注意點(diǎn)實(shí)例分析

    Java多態(tài)用法與注意點(diǎn)實(shí)例分析

    這篇文章主要介紹了Java多態(tài)用法與注意點(diǎn),結(jié)合實(shí)例形式分析了java多態(tài)相關(guān)的向上轉(zhuǎn)型、向下轉(zhuǎn)型、隱藏等相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • Java中的命名與目錄接口JNDI基本操作方法概覽

    Java中的命名與目錄接口JNDI基本操作方法概覽

    這篇文章主要介紹了Java中的命名與目錄接口JNDI基本操作方法概覽,JNDI提供統(tǒng)一的客戶端API使得Java應(yīng)用程序可以和這些命名服務(wù)和目錄服務(wù)之間進(jìn)行交互,需要的朋友可以參考下
    2016-03-03
  • Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決

    Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決

    這篇文章主要介紹了Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringCloud之Feign示例詳解

    SpringCloud之Feign示例詳解

    本篇文章主要介紹了SpringCloud之Feign示例詳解,詳細(xì)的介紹了Feign簡介和使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • MybatisPlus為何可以不用@MapperScan詳解

    MybatisPlus為何可以不用@MapperScan詳解

    這篇文章主要給大家介紹了關(guān)于MybatisPlus為何可以不用@MapperScan的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MybatisPlus具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-04-04
  • MyBatis-Spring配置的講解

    MyBatis-Spring配置的講解

    今天小編就為大家分享一篇關(guān)于MyBatis-Spring配置的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java實(shí)現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法

    Java實(shí)現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Mybatis反射核心類Reflector的實(shí)現(xiàn)

    Mybatis反射核心類Reflector的實(shí)現(xiàn)

    本文主要介紹了Mybatis反射核心類Reflector的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Java Spring-Cache key配置注意事項(xiàng)介紹

    Java Spring-Cache key配置注意事項(xiàng)介紹

    本文主要對java spring-cache key配置注意事項(xiàng)進(jìn)行了介紹,小編覺得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • Java synchronized的鎖升級過程詳解

    Java synchronized的鎖升級過程詳解

    在 JDK 1.6之前,synchronized 是一個(gè)重量級、效率比較低下的鎖,但是在JDK 1.6后,JVM 為了提高鎖的獲取與釋放效,,對 synchronized 進(jìn)行了優(yōu)化,所以本文給大家介紹了synchronized的鎖升級過程,需要的朋友可以參考下
    2024-04-04

最新評論

凤城市| 资兴市| 锦州市| 阿克苏市| 保定市| 新蔡县| 嵊泗县| 苏尼特左旗| 栾城县| 饶阳县| 四川省| 德昌县| 青神县| 安多县| 清新县| 江津市| 罗城| 高雄市| 永济市| 虞城县| 新绛县| 拜城县| 蕲春县| 柞水县| 剑阁县| 宿州市| 土默特右旗| 米脂县| 恭城| 静安区| 内黄县| 宝山区| 汾阳市| 太湖县| 新绛县| 遵化市| 东乡| 沧州市| 安庆市| 武冈市| 卫辉市|