随笔 - 832  文章 - 2  评论 - 31  阅读 - 167万

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

posted on   小破孩楼主  阅读(503)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示