栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java延迟队列 DelayQueue讲解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java延迟队列 DelayQueue讲解

延迟队列 DelayQueue讲解
  • 前言
  • 一、DelayQueue是什么?
  • 二、使用步骤
    • 1.创建一个Delayed接口的实现类,改元素要放入到DealyQueue队列中
    • 2.创建DelayQueue 的工具类
    • 3.处理 我们的业务需求 类
    • 4.使用


前言

在项目中,下单业务下单之后,如果30分钟之内没有付款就自动取消付款,就需要用到延迟队列,来实现取消功能


一、DelayQueue是什么?

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

二、使用步骤 1.创建一个Delayed接口的实现类,改元素要放入到DealyQueue队列中

代码如下(示例):

import com.google.common.primitives.Ints;

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

public abstract class Task implements Delayed, Runnable{
    private String id = "";
    private long start = 0;

    public Task(String id, long delayInMilliseconds){
        this.id = id;
        this.start = System.currentTimeMillis() + delayInMilliseconds;
    }

    public String getId() {
        return id;
    }

	//获取剩余的时间,为0获取负数时取出
    //TimeUnit.NANOSECONDS 毫微妙
    @Override
    public long getDelay(TimeUnit unit) {
        long diff = this.start - System.currentTimeMillis();
        return unit.convert(diff, TimeUnit.MILLISECONDS);
    }

	// 排序
    @Override
    public int compareTo(Delayed o) {
        return Ints.saturatedCast(this.start - ((Task) o).start);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null) return false;
        if (!(o instanceof Task)) {
            return false;
        }
        Task t = (Task)o;
        return this.id.equals(t.getId());
    }

    @Override
    public int hashCode() {
        return this.id.hashCode();
    }
}
2.创建DelayQueue 的工具类

代码如下(示例):

data = pd.read_csv(
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Executors;

@Component
public class TaskService {
    private TaskService taskService;
    private DelayQueue delayQueue =  new DelayQueue();

    @PostConstruct
    private void init() {
        taskService = this;

        Executors.newSingleThreadExecutor().execute(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Task task = delayQueue.take();
                        task.run();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public void addTask(Task task){
        if(delayQueue.contains(task)){
            return;
        }
        delayQueue.add(task);
    }

    public void removeTask(Task task){
        delayQueue.remove(task);
    }

3.处理 我们的业务需求 类
public class OrderUnpaidTask extends Task {
    private final Log logger = LogFactory.getLog(OrderUnpaidTask.class);
    private int orderId = -1;

	// 订单id , 超时时间
    public OrderUnpaidTask(Integer orderId, long delayInMilliseconds){
        super("OrderUnpaidTask-" + orderId, delayInMilliseconds);
        this.orderId = orderId;
    }

    public OrderUnpaidTask(Integer orderId){
        super("OrderUnpaidTask-" + orderId, 60 * 60 * 1000);
        this.orderId = orderId;
    }

    @Override
    public void run() {
        logger.info("系统开始处理延时任务---订单超时未付款---" + this.orderId);

        // 业务处理

        logger.info("系统结束处理延时任务---订单超时未付款---" + this.orderId);
    }
}
4.使用
	@Autowired
    private TaskService taskService;
	// 订单支付超期任务
    taskService.addTask(new OrderUnpaidTask(orderId));

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/838125.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号