訂單一定時間未支付-回倉(Timer實現)

做商品支付的開發過程中,一個必須考慮到的環節:用戶在點擊下單購買,同時也點擊了支付,這時候由於各種原因,用戶長時間未支付,對於庫存有限的商品來說,一般會將當前訂單的商品庫存鎖定一段時間,這段時間一過,還未支付,庫存自動回庫,同時修改支付狀態,可以參照下淘寶的生成訂單未支付過程。

1:可以使用java中自帶的api–Timer , 但是操作比較繁瑣 。

2:電商項目中引入第三方插件:石英鐘quartZ

3:定時任務邏輯: 設置24小時支付超時
如何判斷一個訂單是否超時?
訂單中有status(訂單狀態 1未付款 2已付款 3未發貨4已發貨5交易成功 6交易失敗)字段和createTime(訂單生成時間)字段 , 檢索訂單表中創建時間距離現在大於24 , 並且status爲1 的數據 , update status爲6。
如果判斷超時 , 後續如何處理?
update status爲6(訂單失效) , 對應的商品數量回退歸還庫存

4:使用rubbitmq消息隊列

這裏使用定時器Timer(隊列機制)
正常生成訂單支付:生成訂單即觸發timer,支付成功後,取消該定時器。
①:提交訂單方法 結束之前調用定時器裏面的修改訂單狀態方法。

②:提交訂單時 設置24小時未付款會執行此方法,修改狀態爲已關閉。

③:在訂單付款的方法結束時也需要調用定時器關閉方法,否則訂單狀態也會修改爲已關閉

package cn.timer;

import java.util.Timer;
import java.util.TimerTask;
import org.apache.log4j.Logger;

public class CommTimer {
private static final Logger out = Logger.getLogger(CommTimer.class);
	/**
	 * 訂單關閉(設置指定24小時後,修改訂單狀態爲已關閉)
	 * @param bolId  訂單號
	 */
	public static void orderClose(final String bolId) {
		final Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				//SpringContextUtils爲自定義類,通過反射機制直接操作業務層接口OrderService
				OrderService os= SpringContextUtils.getBean(OrderService.class);
				try {
					Integer ret = os.updateState(bolId,0);
					if(ret > 0) {
						out.info("訂單號:"+bolId+"已關閉");
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				// 中斷線程
				timer.cancel();
			}
		},24*60*60*1000);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章