Java使用HashedWheelTimer延迟操作


一、简介

我们在某些业务场景中会遇到延迟操作,比如延迟通知、订单超过30分钟未支付取消订单等,这些业务需求的实现其实很好办。


二、实现方式

有多种方式,比如:扫描数据库轮训查询、Java的DelayQueue的方式,但是前者有明显的缺陷,系统负担很大,而后者的代码复杂度相对更高,所以感觉这两者都不太合适。

这里使用Netty的HashedWheelTimer,它很好的帮助我们实现延迟。

(1)首先是pom

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.24.Final</version>
</dependency>

(2)具体代码

package com;

import io.netty.util.HashedWheelTimer;
import io.netty.util.Timeout;
import io.netty.util.TimerTask;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        // 定义一个时间管理队列
        HashedWheelTimer timer = new HashedWheelTimer();
        // 定义多个时间延迟任务
        MyTimerTask task1 = new MyTimerTask();
        MyTimerTask task2 = new MyTimerTask();

        timer.newTimeout(task1, 2, TimeUnit.SECONDS);
        timer.newTimeout(task2, 3, TimeUnit.SECONDS);
    }

    static class MyTimerTask implements TimerTask {
        @Override
        public void run(Timeout timeout) throws Exception {
            System.out.println("-----------------执行操作-----------------");
        }
    }
}

它的优势在于,效率高,任务触发时间延迟时间比delayQueue低,代码复杂度比delayQueue低。但缺陷也是非常明显,那就是服务器重启后,数据全部消失。


总结

我们能够看到HashedWheelTimer的优点和缺点,不管是Java的DelayQueue还是HashedWheelTimer,在项目停止时数据都会消失,这是硬伤。在这种时候,使用RabbitMQ实际上是一种很优雅、明智的方法,值得一试。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值