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去存,不要纠结,这个真的很浪费时间。后续再排查。

相关推荐
胖咕噜的稞达鸭16 分钟前
自定义shell命令行解释器自制
java·开发语言
q***33373 小时前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
Y***h1877 小时前
第二章 Spring中的Bean
java·后端·spring
8***29317 小时前
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
java·前端·spring
CoderYanger7 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
q***06297 小时前
Tomcat的升级
java·tomcat
多多*7 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
青云交7 小时前
Java 大视界 -- Java 大数据在智能物流无人配送车路径规划与协同调度中的应用
java·spark·路径规划·大数据分析·智能物流·无人配送车·协同调度
d***81728 小时前
解决SpringBoot项目启动错误:找不到或无法加载主类
java·spring boot·后端
ᐇ9598 小时前
Java集合框架深度实战:构建智能教育管理与娱乐系统
java·开发语言·娱乐