美文网首页
DelayQueue-延迟队列

DelayQueue-延迟队列

作者: 一个老程序员 | 来源:发表于2022-03-26 23:12 被阅读0次

DelayQueue是什么

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

DelayQueue能做什么

交易结束后,需要通知业务方交易结果,如果第一次通知失败,则需要延迟3分钟发起第二次通知

具体实现

定义元素类,作为队列的元素
 DelayQueue只能添加(offer/put/add)实现了Delayed接口的对象,意思是说我们不能想往DelayQueue里添加什么就添加什么,不能添加int、也不能添加String进去,必须添加我们自己的实现了Delayed接口的类的对象,来代码:

@Data
public class DelaySendInfo implements Delayed {
    private String name;
    //    延迟时间
    private long delayTime;
    //    过期时间
    private long expireTime;

    public DelaySendInfo(String name, long delayTime) {
        this.name = name;
        this.expireTime = System.currentTimeMillis() + delayTime;
    }

    /**
     * 用于取DelayQueue里面的元素时判断是否到了延时时间,否则不予获取,是则获取
     *当返回值小于等于0,则表示时间过期,该元素会被队列取出
     * @param unit
     * @return
     */
    @Override
    public long getDelay(TimeUnit unit) {

        long diff = unit.convert(expireTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        return diff;
    }

    /**
     * 该方法用于确认delayQueue中的元素顺序,值越大越靠后
     * 返回值等于0,表示该元素和比较元素相等
     * 返回值小于0,表示该元素小于比较元素
     * 返回值大于0,表示该元素大于比较元素
     * @param o
     * @return
     */
    @Override
    public int compareTo(Delayed o) {
        return (int) (this.expireTime - ((DelaySendInfo) o).getDelayTime());
    }


}

写一个线程模拟延迟发送通知

public class ProdecerThread extends Thread{
    DelayQueue<DelaySendInfo>delayQueue;
    public ProdecerThread(DelayQueue<DelaySendInfo>delayQueue){
        this.delayQueue=delayQueue;
    }
    @Override
    public void run() {
//        模拟延迟发送通知,第一次延迟1秒发送,第二次延迟2秒发送,第三次延迟3秒发送
        for(int i=1;i<4;i++){
            DelaySendInfo delaySendInfo=new DelaySendInfo(i+"",i*1000,"SUCCESS");
            delayQueue.offer(delaySendInfo);
        }
    }
}

写一个线程模拟不停从队列中读取要发送的消息

@Slf4j
public class ConsumerThread extends Thread{
    private DelayQueue<DelaySendInfo>delayQueue;
    public ConsumerThread(DelayQueue<DelaySendInfo>delayQueue){
        this.delayQueue=delayQueue;
    }
//    模拟生产中的线程,不停去delayQueue中取定时发送的元素
    @Override
    public void run() {
        while(true){
            try {
               DelaySendInfo delaySendInfo= delayQueue.take();
                log.info("{}取出元素:{}",new Date(),delaySendInfo);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

执行

    public static void main(String[] args) {
        DelayQueue<DelaySendInfo>delayQueue=new DelayQueue<>();
        new ConsumerThread(delayQueue).start();
        new ProdecerThread(delayQueue).start();
    }

结果打印

23:04:46.451 [Thread-0] INFO com.epay.send.ConsumerThread - Sun Mar 27 23:04:46 CST 2022取出元素:DelaySendInfo(name=1, delayTime=0, expireTime=1648393486435, msg=SUCCESS)
23:04:47.450 [Thread-0] INFO com.epay.send.ConsumerThread - Sun Mar 27 23:04:47 CST 2022取出元素:DelaySendInfo(name=2, delayTime=0, expireTime=1648393487435, msg=SUCCESS)
23:04:48.450 [Thread-0] INFO com.epay.send.ConsumerThread - Sun Mar 27 23:04:48 CST 2022取出元素:DelaySendInfo(name=3, delayTime=0, expireTime=1648393488435, msg=SUCCESS)

相关文章

  • DelayQueue-延迟队列

    DelayQueue是什么 DelayQueue是一个无界的BlockingQueue,用于放置实现了Delaye...

  • RabbitMq 延迟队列

    一、延迟队列 延迟队列就是比普通队列多了一个延迟属性。单从字面意思,可以理解为这个队列是延迟的,但我们普遍默认的,...

  • 2021-03-28_Rabbitmq延迟队列学习

    Rabbitmq延迟队列学习 1概述 1.1延迟队列 延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后...

  • 基于Rabbitmq实现延迟队列

    转自 基于Rabbitmq实现延迟队列 基于Rabbitmq实现延迟队列 延迟队列的使用场景 淘宝订单业务:下单后...

  • 详细介绍Spring Boot + RabbitMQ实现延迟队列

    背景 何为延迟队列? 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就...

  • Laravel源码分析 - Redis延迟队列(一)

    延迟队列,首先它是一个队列。然后其任务可以延迟被执行。实现队列,以及延迟队列的方式有很多种,基于Redis的方式也...

  • spring boot 集成rabbitmq 实现延迟队列

    rabbitmq 实现延迟队列 什么是延迟队列 延迟队列存储的对象肯定是对应的延时消息,所谓”延时消息”是指当消息...

  • Spring Cloud Stream 进阶配置——使用延迟队列

    ps: 本文所有代码可在 这里 查看。 延迟队列 延迟队列 操作的对象是延迟消息,所谓 “延迟消息” 是指当消息被...

  • 用rebbitMq来实现你的延迟队列功能

    延迟队列 在我们的上一篇文章使用delayedQueue实现你本地的延迟队列中提到了延迟队列的作用. 但是我们知道...

  • 10.延迟队列

    文章参考:Rabbit实战指南 延迟队列 延迟队列存储的对象是对应的延迟消息,所谓“延迟消息”是指当消息被发送以后...

网友评论

      本文标题:DelayQueue-延迟队列

      本文链接:https://www.haomeiwen.com/subject/ymlujrtx.html