Java 實現訂單未支付超時自動取消功能(京東商城為例)
在電商上購買商品後,如果在下單而又沒有支付的情況下,一般提示30分鐘完成支付,否則訂單自動。比如在京東下單為完成支付:
超過24小時,就會自動取消訂單,下面使用 Java 定時器實現超時取消訂單功能。
- Timer 定時器
Timer 是一個調度任務的執行的工具,任務可以一次性定時執行或者定時重復執行,系統會啟動一個線程來執行所有的定時任務。
- TimerTask 定時任務
TimerTask 是一個抽象類,它實現瞭 Runnable,實現 Runnable 也就是創建瞭多線程任務。
創建 TimerTask
TimerTask 是抽象類,抽象是為瞭代碼復用,要創建一個類繼承 TimerTask:
public class CancelOrderTimeTask extends TimerTask { private Long id; public CancelOrderTimeTask(long id) { this.id = id; } @Override public void run() { // 執行取消訂單 cancelOrder(id); System.out.println(getCurrentTime() + " 時間取消訂單,訂單id:" + id); } private String getCurrentTime() { SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); return sdf.format(date); } }
在 run
方法執行訂單取消任務。
因為這個方法不是創建 bean,所以在調用的 dao 或者其他的 bean 時,要使用 ApplicationContext
獲取 bean。
Timer 定時器調用 TimerTask
新建 Timer,使用 schedule 方法調用,方法有兩個參數,第一個是任務的實例,另一個是延遲多久後調用任務,單位是毫秒。代碼如下:
@RestController public class TimerController { @GetMapping("/timer") public String timer(long id) { Timer timer = new Timer(); CancelOrderTimeTask timeTask = new CancelOrderTimeTask(id); System.out.println("當前時間是" + getCurrentTime()); //10秒後執行任務 timer.schedule(timeTask,10 * 1000); return "ok"; } private String getCurrentTime() { SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); return sdf.format(date); } }
調用方法後,控制臺輸出如下內容,說明定時調用成功。
當前時間是2022-01-24 00:05:09
2022-01-24 00:05:19 時間取消訂單,訂單id:3
總結
- 首先創建定時任務,繼承 TimerTask,在 run 方法裡面寫業務邏輯。
- 使用 Timer 調用 schedule 方法, schedule 方法寫入 TimerTask 實例以及延遲時間。
源碼
github源碼
到此這篇關於Java 實現訂單未支付超時自動取消的文章就介紹到這瞭,更多相關java訂單超時自動取消內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java定時任務schedule和scheduleAtFixedRate的異同
- 深入瞭解Java定時器中的Timer的原理
- java中Timer定時器的使用和啟動方式
- Java任務定時執行器案例的實現
- Java技能點之SimpleDateFormat進行日期格式化問題