redission实现延时队列

自用,分布式的延时队列

效果

前提代码

XML 复制代码
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.23.5</version>
        </dependency>
XML 复制代码
spring:
  data:
    redis:
      host: localhost
      password: 123456
java 复制代码
@Getter
@ToString
public class DelayedTask<T> implements Delayed, Serializable {

    private static final long serialVersionUID = 3018458065076640934L;
    private final T taskContent;

    private final Long triggerTime;

    /**
     * @param seconds 秒
     */
    public DelayedTask(T taskContent, Long seconds) {
        this.taskContent = taskContent;
        this.triggerTime = System.currentTimeMillis() + seconds * 1000;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(triggerTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        return this.triggerTime.compareTo(((DelayedTask) o).triggerTime);
    }

}

核心代码

java 复制代码
@RestController
@RequiredArgsConstructor
@RequestMapping("/")
@Slf4j
public class DelayController {
    private final RedissonClient redissonClient;
    private volatile boolean QUEUE_RUNNING = true;


    @GetMapping("/test")
    public void test() throws InterruptedException {

        RBlockingDeque<DelayedTask> blockingDeque = redissonClient.getBlockingDeque("my-delay-queue");
        RDelayedQueue<DelayedTask> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);

        new Thread(()->{
            while (QUEUE_RUNNING){
                try {
                    var delayedTask = blockingDeque.take();
                    log.info("需要执行这个任务,{}", delayedTask);
                } catch (Exception e) {
                    log.error("延时任务出错:{}", e);
                }
            }
        }).start();

        Thread.sleep(15000L);
        QUEUE_RUNNING = false;
    }

    @PostMapping("/add")
    public void add() {
        RBlockingDeque<DelayedTask> blockingDeque = redissonClient.getBlockingDeque("my-delay-queue");
        final RDelayedQueue<DelayedTask> delayedQueue = redissonClient.getDelayedQueue(blockingDeque);

        delayedQueue.offer(new DelayedTask("做这个任务", 3L),3L, TimeUnit.SECONDS);
        delayedQueue.offer(new DelayedTask("做这个任务2",5L),5L, TimeUnit.SECONDS);
        delayedQueue.offer(new DelayedTask("做这个任务3",8L),8L, TimeUnit.SECONDS);
    }
}

我自己的踩坑

1.如果延时队列,发现延时时间没有效果,请注意一下你的自定义对象,有没有实现序列化接口

2.如果实现了序列化接口,还是发现没有延时 ,那么请记住这个问题。然后把自定义的类直接换成String,把自定义的对象转换成JSON去存,不要纠结,这个真的很浪费时间。后续再排查。

相关推荐
树獭非懒1 小时前
告别繁琐多端开发:DivKit 带你玩转 Server-Driven UI!
android·前端·人工智能
Re_zero2 小时前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
三少爷的鞋2 小时前
为什么应该先在 IntelliJ 中学习 Kotlin 与协程,而不是直接上 Android Studio
android
洋洋技术笔记2 小时前
Spring Boot条件注解详解
java·spring boot
不爱说话郭德纲17 小时前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
程序员清风20 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55121 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
Sinclair21 小时前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
雮尘1 天前
手把手带你玩转Android gRPC:一篇搞定原理、配置与客户端开发
android·前端·grpc
ktl1 天前
Android 编译加速/优化 80%:一个文件搞定,零侵入零配置
android