zoukankan      html  css  js  c++  java
  • 延迟队列DelayQueue简单入门

    参考:DelayQueue(1)

              DelayQueue实现原理及应用场景分析

    一、DelayQueue是什么

    DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。

    二、DelayQueue能做什么

    1. 淘宝订单业务:下单之后如果三十分钟之内没有付款就自动取消订单。 
    2. 饿了吗订餐通知:下单成功后60s之后给用户发送短信通知。

    三、实际开发中的应用

    简单的延时队列要有三部分:第一实现了Delayed接口的消息体、第二消费消息的消费者、第三存放消息的延时队列
    1.消息体。实现接口 Delayed ,重写方法 compareTo 和 getDelay

    public class Message implements Delayed{
    
        private Map<String,String> body=new HashMap<>();  //消息内容
        private long excuteTime;//执行时间
        private String type;
    
        public Map<String, String> getBody() {
            return body;
        }
        public void setBody(Map<String, String> body) {
            this.body = body;
        }
        public long getExcuteTime() {
            return excuteTime;
        }
        public void setExcuteTime(long excuteTime) {
            this.excuteTime = excuteTime;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public Message(long delayTime,String type) {
            this.excuteTime = TimeUnit.NANOSECONDS.convert(delayTime, TimeUnit.MILLISECONDS) + System.nanoTime();
            this.type=type;
        }
        @Override
        public int compareTo(Delayed delayed) {
            long d = (getDelay(TimeUnit.NANOSECONDS) - delayed.getDelay(TimeUnit.NANOSECONDS));
            return (d == 0) ? 0 : ((d < 0) ? -1 : 1);
        }
        @Override
        public long getDelay(TimeUnit unit) {
            return  unit.convert(this.excuteTime - System.nanoTime(), TimeUnit.NANOSECONDS);
        }
    }

    2.声明消费者。实现接口Runnable

    public class Consumer implements Runnable {
    
        // 延时队列
        private DelayQueue<Message> queue;
        public static boolean  isRun=false;
    
        public Consumer(DelayQueue<Message> queue) {
            this.queue = queue;
        }
    
        @Override
        public void run() {
            isRun=true;
            while (true) {
                try {
                    Message take = queue.take();
                    System.out.println("消息类型:" + take.getType());
                    Map<String,String> map=take.getBody();
                    System.out.println("消息内容:");
                    for (String key:map.keySet()){
                        System.out.println("key="+map.get(key));
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    3.延迟队列管理者,用于在任何地方获取 DelayQueue 

    public class DelayQueueManager {
    
        private static DelayQueue<Message> delayQueue=null;
    
        static {
            // 创建延时队列
           delayQueue = new DelayQueue<Message>();
        }
    
        public static DelayQueue<Message> getDelayQueue(){
            return delayQueue;
        }
    }

    4.使用延迟队列发送消息

    // 添加延时消息,m1 延时5s
        Message m1 = new Message( 5000,"订单");
        m1.getBody().put("content","12345");
        // 添加延时消息,m1 延时5s
        DelayQueueManager.getDelayQueue().offer(m1);
        if(!Consumer.isRun){
            // 启动消费线程
            new Thread(new Consumer(DelayQueueManager.getDelayQueue())).start();
        }

    以上就是延迟队列delayQueue的简单入门配置和使用,希望对你有帮助!

    文章参考:
    https://blog.csdn.net/zhu_tianwei/article/details/53549653

  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/zouhong/p/14807972.html
Copyright © 2011-2022 走看看