一、简介
我们在某些业务场景中会遇到延迟操作,比如延迟通知、订单超过30分钟未支付取消订单等,这些业务需求的实现其实很好办。
二、实现方式
具体参考(建议看看):https://juejin.cn/post/7068837416714371102
在上面的链接中,提供了扫描数据库轮训查询、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实际上是一种很优雅、明智的方法,值得一试。
|