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

Java 後台推送訂單給司機端:超時未響應自動流轉下一單邏輯實現

     編輯:程式設計綜合問答

業務流程

    1. 客戶下單 → 後台計算最近司機列表(按距離排序)。 2. 依次推送給司機,每單設置超時定時器(如 30 秒)。 3. 司機接單 → 取消定時器,確認訂單狀態,結束流程。 4. 超時未響應 → 取消當前推送,推送給下一位司機,重複步驟 2-4。 5. 列表耗盡 → 標記訂單「無司機響應」,通知客服/客戶。

核心數據結構


class OrderDispatch {
    String orderId;
    List candidateDrivers; // 已排序
    int currentIndex = 0;
    ScheduledFuture timeoutTask;
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
}

關鍵代碼


void dispatchNext() {
    if (currentIndex >= candidateDrivers.size()) { handleNoDriver(); return; }
    Driver d = candidateDrivers.get(currentIndex++);
    pushToDriver(d); // 個推/FCM
    timeoutTask = scheduler.schedule(() -> {
        if (orderStatus == PENDING) dispatchNext(); // 超時流轉
    }, 30, TimeUnit.SECONDS);
}

void onDriverAccept(String driverId) {
    if (timeoutTask != null) timeoutTask.cancel(false);
    // 確認訂單、更新狀態、通知其他候選司機「已被搶單」
}

性能優化

  • 使用時間輪或 DelayQueue 替代 ScheduledExecutorService,支持百萬級定時任務低開銷。
  • 推送結果異步回調更新狀態,避免阻塞調度線程。
  • 司機位置用 Redis Geo (GEORADIUS) 實時查詢最近 N 位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved