Delay延迟队列

DelayEvent.java

public class DelayEvent2 implements Delayed {
    //到期时间
    private Date startDate;

    public DelayEvent2(Date startDate) {
        this.startDate = startDate;
    }

    public int compareTo(Delayed o){
        long result = this.getDelay(TimeUnit.NANOSECONDS)  - o.getDelay(TimeUnit.NANOSECONDS);
        if (result < 0) {
            return -1;
        } else if (result > 0) {
            return 1;
        } else {
            return 0;
        }
    }

    /**
     * 返回与此对象相关的剩余延迟时间,以给定的时间单位表示
     */
    public long getDelay(TimeUnit unit){
        Date now = new Date();
        long diff = startDate.getTime() - now.getTime();
        return unit.convert(diff, TimeUnit.MILLISECONDS);
    }
}

DelayTask.java

/**
 * 任务任务
 * 作用:添加100个新DelayEvent到DelayQueue队列中
 */
public class DelayTask2 implements Runnable{
    //添加时间
    private int id;
    //队列
    private DelayQueue<DelayEvent2> dq = new DelayQueue<DelayEvent2>();

    public DelayTask2(int id, DelayQueue<DelayEvent2> dq) {
        this.id = id;
        this.dq = dq;
    }

    public void run() {
        //旧Date
        Date date = new Date();
        //新Date
        Date delay = new Date();
        delay.setTime(date.getTime() + id * 1000);

        System.out.println("Thread 时间+:" + id + " 新Date:" + delay);

        //将100个DelayEvent放入DelayQueue
        for(int i = 0;i < 100;i++){
            DelayEvent2 de = new DelayEvent2(delay);
            dq.add(de);
        }
    }
}

DelayDequeueMain.java

public class DelayDequeMain2 {
    public static void main(String[] args) throws Exception{
        DelayQueue<DelayEvent2> dq = new DelayQueue<DelayEvent2>();
        Thread threads[] = new Thread[5];
        for(int i = 0;i < threads.length;i++){
            DelayTask2 task = new DelayTask2(i+1,dq);
            threads[i] = new Thread(task);
        }
        for(int i = 0;i < threads.length;i++){
            threads[i].start();
        }
        for(int i = 0;i < threads.length;i++){
            threads[i].join();
        }
        do{
            int counter = 0;
            DelayEvent2 delayEvent2;
            do{
                delayEvent2 = dq.poll();
                if(delayEvent2 != null){
                    counter++;
                }
            }while(delayEvent2!=null);
            System.out.println("At " + new Date() + " you have read " + counter + " event");
            TimeUnit.MILLISECONDS.sleep(500);
        }while(dq.size()>0);
    }
}

原文地址:https://www.cnblogs.com/yifanSJ/p/9427871.html

时间: 2024-11-06 12:31:46

Delay延迟队列的相关文章

RabbitMQ如何实现延迟队列?

什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行一场处理.这是就可以使用延迟队列将订单信息发送到延迟队列. 场景二:用户希望通过手机远程遥控家里的智能设备在指定的时间进行工作.这时候就可以将用户指令发送到延迟队列,当指令设定的时间到了再将指令推送到

有赞延迟队列设计

延迟队列,顾名思义它是一种带有延迟功能的消息队列. 那么,是在什么场景下我才需要这样的队列呢? 背景 我们先看看以下业务场景: 当订单一直处于未支付状态时,如何及时的关闭订单,并退还库存? 如何定期检查处于退款状态的订单是否已经退款成功? 新创建店铺,N天内没有上传商品,系统如何知道该信息,并发送激活短信?等等 为了解决以上问题,最简单直接的办法就是定时去扫表.每个业务都要维护一个自己的扫表逻辑. 当业务越来越多时,我们会发现扫表部分的逻辑会非常类似.我们可以考虑将这部分逻辑从具体的业务逻辑里面

rabbitmq延迟队列demo

工程结构: 定义jar包依赖的版本,版本很重要,rabbit依赖spring,必须一致,否则报错: <properties> <springframework.version>4.2.7.RELEASE</springframework.version> <spring-rabbit.version>1.6.1.RELEASE</spring-rabbit.version> <junit.version>4.12</junit.

java延迟队列DelayQueue使用及原理

概述 java延迟队列提供了在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素.没有过期元素的话,使用poll()方法会返回null值,超时判定是通过getDelay(TimeUnit.NANOSECONDS)方法的返回值小于等于0来判断.延时队列不能存放空元素. 延时队列实现了Iterator接口,但iterator()遍历顺序不保证是元素的实际存放顺序. 队列元素 DelayQueue<E extends Delayed>的队列元素需要实现Delayed接口,该接口类定义如下:

SpringBoot:RabbitMQ 延迟队列

SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 初探RabbitMQ消息队列中介绍了RabbitMQ的简单用法,顺带提及了下延迟队列的作用.所谓延时消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 延迟队列 延迟队列能做什么? 订单业务: 在电商/点餐

java DelayedQueue延迟队列

代码如下: package com.example.base.concurrent; import java.util.Date; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; import com.example.spring.MyLog; public class MyDelayedQueue { public

【RabbitMQ】一文带你搞定RabbitMQ延迟队列

本文口味:鱼香肉丝? ?预计阅读:10分钟 一.说明 在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列.相信通过上一篇的学习,对于死信队列已经有了更多的了解,这一篇的内容也跟死信队列息息相关,如果你还不了解死信队列,那么建议你先进行上一篇文章的阅读. 这一篇里,我们将继续介绍RabbitMQ的高级特性,通过本篇的学习,你将收获: 什么是延时队列 延时队列使用场景 RabbitMQ中的TTL 如何利用RabbitMQ来实现延时队列 二.本文大纲

【laravel】 Laravel延迟队列

定义延迟队列的两种方式 一 .任务分发的时候指定 \App\Jobs\Jober::dispatch()->delay(20); 二.定义Jober时构造方法中指定 <?php namespace App\Jobs; --------------------------------------------------- class Timer implements ShouldQueue { ----------------------------------------------- pub

Amazon SQS 延迟队列

延迟队列可让您将针对队列的新消息传递操作推迟特定的秒数.如果您创建延迟队列,则发送到该队列的任何消息在延迟期间对用户都保持不可见.队列的默认(最小)延迟为 0 秒.最大延迟为 15 分钟. 延迟队列类似于可见性超时,因为这两种功能都使得使用者在特定的时间段内无法获得消息.二者之间的区别在于:对于延迟队列,消息在首次添加到队列时 是隐藏的:而对于可见性超时,消息只有在从队列使用后 才是隐藏的.下图说明了延迟队列和可见性超时之间的关系. 要为单条消息 而不是整个队列设置延迟(以秒为单位),请使用消息