首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

電商退款流程時間控制:Quartz 定時任務調度方案

     編輯:程式設計綜合問答

業務流程

  1. 用戶 7 天內可申請退款,超時不可申請。
  2. 賣家 3 種響應:同意/拒絕/不操作(7 天自動同意)。
  3. 需對**每個訂單**精確控制時間節點。

架構設計:訂單狀態機 + 分布式定時任務

訂單狀態:NORMAL → REFUND_APPLIED(用戶申請) → 
  SELLER_AGREED(同意) → REFUND_SUCCESS
  SELLER_REJECTED(拒絕) → REFUND_FAILED
  AUTO_AGREED(7天自動同意) → REFUND_SUCCESS

技術方案:Quartz 集群調度

  1. 申請退款時:向 Quartz 添加兩個 Job:
    • Job A:runAt = applyTime + 7天,執行「自動同意退款」邏輯(檢查狀態仍為 APPLIED 才執行)。
    • Job B:runAt = applyTime + 7天,執行「用戶申請超時關閉」邏輯(若狀態非 APPLIED 則忽略)。
  2. 賣家操作時:同意/拒絕 → 更新訂單狀態 → **刪除對應的 Quartz Job**(防止自動同意覆蓋)。
  3. 集群模式:Quartz JDBC JobStore + 數據庫鎖,多實例高可用,避免單點故障。

關鍵代碼

// 添加自動同意 Job
JobDetail job = JobBuilder.newJob(AutoAgreeRefundJob.class)
    .withIdentity("autoAgree_" + orderId)
    .usingJobData("orderId", orderId)
    .build();
Trigger trigger = TriggerBuilder.newTrigger()
    .startAt(Date.from(applyTime.plusDays(7).atZone(ZoneId.systemDefault()).toInstant()))
    .build();
scheduler.scheduleJob(job, trigger);

// 賣家同意時刪除
scheduler.deleteJob(new JobKey("autoAgree_" + orderId));

替代方案

  • Redis 延時隊列:ZADD refund:timeout orderId,消費者輪詢 ZRANGEBYSCORE 執行,輕量無依賴。
  • 消息隊列 TTL + 死信隊列:RabbitMQ 消息設置 TTL=7天,過期進死信隊列由消費者處理自動同意。

**推薦 Quartz**:功能全、持久化可靠、支持 Cron/Calendar、集群成熟,官網 https://www.oschina.net/p/quartz。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved