java 延迟队列实现订单超时
时间: 2025-03-04 20:30:57 浏览: 27
### Java 实现延迟队列处理订单超时
#### 使用 `ScheduledThreadPoolExecutor` 和 `DelayQueue`
为了实现延时队列来处理订单超时问题,可以利用 Java 并发包中的 `DelayQueue` 结合 `ScheduledThreadPoolExecutor` 来完成这一功能。下面是一个具体的例子。
```java
import java.util.concurrent.*;
class Order implements Delayed {
private final long triggerTime;
private String orderId;
public Order(String id, long delayInMilliseconds) {
this.orderId = id;
this.triggerTime = System.currentTimeMillis() + delayInMilliseconds;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(triggerTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
if (this.getDelay(TimeUnit.MILLISECONDS) < ((Order)o).getDelay(TimeUnit.MILLISECONDS)) {
return -1;
}
if (this.getDelay(TimeUnit.MILLISECONDS) > ((Order)o).getDelay(TimeUnit.MILLISECONDS)) {
return 1;
}
return 0;
}
public void processOrderTimeout() {
// 处理订单超时逻辑
System.out.println("Processing timeout for order " + orderId);
}
}
public class OrderTimeoutHandler {
private static final ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
private static final BlockingQueue<Delayed> delayQueue = new DelayQueue<>();
public static void main(String[] args) throws InterruptedException {
Runnable task = () -> {
try {
while (!Thread.currentThread().isInterrupted()) {
Order expiredOrder = delayQueue.take(); // 取出已经到期的任务
expiredOrder.processOrderTimeout();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
};
scheduler.scheduleWithFixedDelay(task, 0L, 1L, TimeUnit.SECONDS);
// 添加几个测试订单到延时队列中
delayQueue.put(new Order("order_001", 5000));
delayQueue.put(new Order("order_002", 8000));
// 模拟程序运行一段时间后关闭调度器
Thread.sleep(15000);
scheduler.shutdownNow();
}
}
```
这段代码展示了如何创建一个简单的延时队列处理器[^1]。这里定义了一个名为 `Order` 的类实现了 `Delayed` 接口,并重写了必要的方法以便能够被放入 `DelayQueue` 中排队等待执行。当某个订单的时间到了之后就会调用其自身的 `processOrderTimeout()` 方法来进行相应的处理工作。
对于更复杂的应用场景,则可能需要考虑采用第三方库如 Redisson 提供的功能更为强大的分布式延时消息队列服务[^3]。
阅读全文
相关推荐


















