`

延时任务处理订单超时方案

    博客分类:
  • java
阅读更多

JDK的延迟队列

方案是利用JDK自带的DelayQueue来实现,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。

List<Order> list;
Order createTime; 延迟30秒,与当前时间比对

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class OrderDelay implements Delayed {

    private String orderId;
    private long timeout;

    OrderDelay(String orderId, long timeout) {
        this.orderId = orderId;
        this.timeout = timeout + System.nanoTime();
    }

    public int compareTo(Delayed other) {
        if (other == this)
            return 0;
        OrderDelay t = (OrderDelay) other;
        long d = (getDelay(TimeUnit.NANOSECONDS) - t
                .getDelay(TimeUnit.NANOSECONDS));
        return (d == 0) ? 0 : ((d < 0) ? -1 : 1);
    }

    // 返回距离你自定义的超时时间还有多少
    public long getDelay(TimeUnit unit) {
        return unit.convert(timeout - System.nanoTime(), TimeUnit.NANOSECONDS);
    }

    void print() {
        System.out.println(orderId+"编号的订单要删除啦。。。。");
    }
}

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.TimeUnit;

public class DelayQueueDemo {

     public static void main(String[] args) { 
            List<String> list = new ArrayList<String>(); 
            list.add("00000001"); 
            list.add("00000002"); 
            list.add("00000003"); 
            list.add("00000004"); 
            list.add("00000005"); 
            DelayQueue<OrderDelay> queue = new DelayQueue<OrderDelay>(); 
            long start = System.currentTimeMillis(); 
            for(int i = 0;i<5;i++){ 
                //延迟三秒取出
                queue.put(new OrderDelay(list.get(i), 
                        TimeUnit.NANOSECONDS.convert(3, TimeUnit.SECONDS))); 
                    try { 
                         queue.take().print(); 
                         System.out.println("After " + 
                                 (System.currentTimeMillis()-start) + " MilliSeconds"); 
                } catch (InterruptedException e) { 
                    e.printStackTrace(); 
                } 
            } 
     }
}




0
1
分享到:
评论

相关推荐

    PHP如何实现订单的延时处理详解

    在本文中,我们将深入探讨如何利用PHP实现订单的延时处理,特别是针对订单超时未支付自动取消的业务需求。在实际的电商或在线交易系统中,这种功能是必不可少的,因为它能确保订单状态的准确性和系统的稳定性。 ...

    RabbitMQ延时消息实现方案

    这种机制可以应用于订单状态检查、异步任务调度、缓存失效、预约处理等多个场景中。RabbitMQ并不直接提供延时队列功能,但是可以通过一些配置和策略模拟出延迟消息的功能。 首先,要理解RabbitMQ中实现延时消息的...

    redis延时队列.zip

    这种功能对于处理定时任务、延迟通知、订单超时等场景非常有用。在这个"redis延时队列.zip"压缩包中,包含两个Java文件:DelayDataConsumer.java和DelayDataProducer.java,它们分别代表了延时队列的消费者和生产者...

    延时队列我在项目里是怎么实现的?.doc

    Redis方案可能更适合轻量级的延时任务,而消息队列如RabbitMQ或RocketMQ更适合处理大规模、高可靠性的延迟消息场景。在设计和实现延时队列时,还需要考虑异常处理、容错机制以及性能优化等问题,确保系统的稳定性和...

    Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列教程对应源码

    在我们项目开发中,我们经常需要在特定时间后执行某些任务,例如订单超时未支付自动取消、资金余额低于限额提醒、延时消息发送等。延迟队列是一种非常实用的解决方案,而Redis也具备延迟队列的功能,这里博主将和...

    一口气说出Java 6种延时队列的实现方法(面试官也得服)

    RabbitMQ 可以用来执行延迟任务,例如可以使用延迟队列来实现订单超时取消等功能。 6. Redis 延时队列 Redis 是一个开源的键值存储数据库,提供了实现延迟队列的功能。Redis 可以用来执行延迟任务,例如可以使用...

    rabbitmq_delayed_message_exchange-3.8.0.ez RabittMq及延时队列插件

    延时队列在业务中有着广泛的应用,例如订单超时处理、定时发送邮件或短信等。通过延时队列,消息可以在特定时间后被消费者处理,而不是立即处理。RabbitMQ的延迟队列插件`rabbitmq_delayed_message_exchange`就是为...

    golang实现redis的延时消息队列功能示例

    延时消息队列是一种允许消息在特定时间后才被消费的机制,这在很多场景下非常有用,例如定时任务、订单超时处理等。Redis作为一个内存数据库,提供了丰富的数据结构,其中ZSet(有序集合)可以用来实现延时队列的...

    1分钟实现“延迟消息”功能

    这种情况下,通常的做法是设置一个每小时执行一次的定时任务,用于查询所有超时未评价的订单,并更新其状态。 这种方法虽然简单易行,但在实际应用中存在一些明显的不足之处: 1. **轮询效率低**:每个小时都需要...

    Go-delay-queue基于Redis实现的延迟队列

    在IT行业中,延迟队列是一种特殊的消息队列,它允许我们设定消息在特定时间后才被消费,这对于处理定时任务、订单超时、通知发送等场景非常有用。本项目是基于Go语言和Redis实现的延迟队列,借鉴了有赞(Zan)的设计...

    spring-boot-starter-validation-1.3.5.RELEASE.zip

    6. **延时队列和定时任务**:这类功能在分布式系统中广泛使用,比如在电商的订单超时处理、任务调度、消息延迟发送等场景。它们可以基于各种技术实现,如Redis的延时队列、Quartz或Spring Task等。 为了深入了解...

    关于利用RabbitMQ实现延迟任务的方法详解

    在某些场景下,我们需要实现延迟任务,比如订单超时处理、任务重试等,RabbitMQ提供了相应的功能来支持这些需求。本文将深入探讨如何利用RabbitMQ的TTL(Time To Live)和Dead Letter Exchange特性来实现延迟任务。 ...

Global site tag (gtag.js) - Google Analytics