• 延迟队列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

  • 相关阅读:
    C# 谈谈代码重构
    收藏.NET 技术社区
    步步为营 .NET三层架构解析 四、Model设计(四种设计方式)
    C# 谈谈abstract用法 和一个简单abstract factory
    步步为营 .NET三层架构解析 一、什么是三层架构
    用户登陆的验证码的制作
    控制部分字体的颜色
    回发或回调参数无效。在配置中使用 <pages enableEventValidation= "true "/> 或在页面中使用 <%@ Page EnableEventValidation= "true " %> 启用了事件验证
    实习记2
    sniffer攻击
  • 原文地址:https://www.cnblogs.com/zouhong/p/14807972.html
Copyright © 2020-2023  润新知