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

相关推荐
王元_SmallA2 小时前
Redis Desktop Manager(Redis可视化工具)安装
java·后端
ᐇ9592 小时前
Java HashMap深度解析:数据结构、原理与实战指南
java·开发语言·数据结构
好好研究2 小时前
Spring框架 - 开发方式
java·后端·spring
武子康2 小时前
Java-166 Neo4j 安装与最小闭环 | 10 分钟跑通 + 远程访问 Docker neo4j.conf
java·数据库·sql·docker·系统架构·nosql·neo4j
2301_796512523 小时前
Rust编程学习 - 为什么说Cow 代表的是Copy-On-Write, 即“写时复制技术”,它是一种高效的 资源管理手段
java·学习·rust
编啊编程啊程3 小时前
【029】智能停车计费系统
java·数据库·spring boot·spring·spring cloud·kafka
hashiqimiya3 小时前
springboot后端的接口headers
java·spring boot·后端
懒羊羊不懒@3 小时前
JavaSe—集合框架、Collection集合
java·开发语言