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

相关推荐
imDwAaY1 分钟前
Spring Boot的核心配置文件一览及其加载顺序
java·spring boot·后端
zhangx1234_4 分钟前
javaEE 多线程1
java·linux·服务器
鬼手点金8 分钟前
opencode-crawl4ai使用建议
java·开发语言·人工智能·python·机器学习
专业程序开发源22 分钟前
springboot校园志愿者管理系统28562-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
thefool11226626 分钟前
多线程 2
java
daidaidaiyu10 小时前
ThingsBoard 集群的核心逻辑源码分析
java
我可能是个假开发11 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong11 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
【JAVA】玩家12 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Android系统攻城狮12 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶