延时任务处理订单超时方案_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 延时任务处理订单超时方案

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

 2020/5/23 18:36:19  zw7534313  程序员俱乐部  我要评论(0)
  • 摘要:JDK的延迟队列方案是利用JDK自带的DelayQueue来实现,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。List<Order>list;OrdercreateTime;延迟30秒,与当前时间比对importjava.util.concurrent.Delayed;importjava.util.concurrent.TimeUnit
  • 标签:超时

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(); 
                } 
            } 
     }
}




上一篇: 10个 上海宝付PHP 开发常用代码片段 下一篇: 没有下一篇了!
发表评论
用户名: 匿名