欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

延时任务处理订单超时方案

程序员文章站 2022-05-30 21:46:41
...

JDK的延迟队列

方案是利用JDK自带的DelayQueue来实现,这是一个*阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。

List<Order> list;
Order createTime; 延迟30秒,与当前时间比对

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class OrderDelay implements Delayed {

    private String orderId;
    private long timeout;

    OrderDelay(String orderId, long timeout) {
        this.orderId = orderId;
        this.timeout = timeout + System.nanoTime();
    }

    public int compareTo(Delayed other) {
        if (other == this)
            return 0;
        OrderDelay t = (OrderDelay) other;
        long d = (getDelay(TimeUnit.NANOSECONDS) - t
                .getDelay(TimeUnit.NANOSECONDS));
        return (d == 0) ? 0 : ((d < 0) ? -1 : 1);
    }

    // 返回距离你自定义的超时时间还有多少
    public long getDelay(TimeUnit unit) {
        return unit.convert(timeout - System.nanoTime(), TimeUnit.NANOSECONDS);
    }

    void print() {
        System.out.println(orderId+"编号的订单要删除啦。。。。");
    }
}

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.TimeUnit;

public class DelayQueueDemo {

     public static void main(String[] args) { 
            List<String> list = new ArrayList<String>(); 
            list.add("00000001"); 
            list.add("00000002"); 
            list.add("00000003"); 
            list.add("00000004"); 
            list.add("00000005"); 
            DelayQueue<OrderDelay> queue = new DelayQueue<OrderDelay>(); 
            long start = System.currentTimeMillis(); 
            for(int i = 0;i<5;i++){ 
                //延迟三秒取出
                queue.put(new OrderDelay(list.get(i), 
                        TimeUnit.NANOSECONDS.convert(3, TimeUnit.SECONDS))); 
                    try { 
                         queue.take().print(); 
                         System.out.println("After " + 
                                 (System.currentTimeMillis()-start) + " MilliSeconds"); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
            } 
     }
}




相关标签: java