Java實現(xiàn)商城訂單超時取消功能
大多數(shù)的B2C商城項目都會有限時活動,當(dāng)用戶下單后都會有支付超時時間,當(dāng)訂單超時后訂單的狀態(tài)就會自動變成已取消 ,這個功能的實現(xiàn)有很多種方法,本文的實現(xiàn)方法適合大多數(shù)比較小的商城使用。
實現(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ù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決
這篇文章主要介紹了Spring中使用自定義ThreadLocal存儲導(dǎo)致的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
MybatisPlus為何可以不用@MapperScan詳解
這篇文章主要給大家介紹了關(guān)于MybatisPlus為何可以不用@MapperScan的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MybatisPlus具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-04-04
Java實現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法
這篇文章主要介紹了Java實現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01
Mybatis反射核心類Reflector的實現(xiàn)
本文主要介紹了Mybatis反射核心類Reflector的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11

