当前位置: 首页 > news >正文

redission实现延时队列

自用,分布式的延时队列

效果

前提代码

        <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.5</version></dependency>
spring:data:redis:host: localhostpassword: 123456
@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;}@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(triggerTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);}@Overridepublic int compareTo(Delayed o) {return this.triggerTime.compareTo(((DelayedTask) o).triggerTime);}}

核心代码

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

http://www.dtcms.com/a/565318.html

相关文章:

  • 浏览器端缓存地图请求:使用 IndexedDB + ajax-hook 提升地图加载速度
  • 地铁工程建设论文投稿网站谷歌广告代运营
  • 广东备案网站软件开发怎么学
  • 【成长纪实】鸿蒙 ArkTS 语言从零到一完整指南
  • PyTorch模型部署实战:从TorchScript到LibTorch的完整路径
  • 网站开发后台结构江西建设职业技术学院网站
  • 如何导出VSCode的已安装扩展列表?
  • 高级系统架构师笔记——系统质量属性与架构评估(1)软件系统质量属性
  • Vscode参数设置及使用记录ubuntu2204(更新中)
  • Linux上vscode c/c++开发环境搭建详细-abuild
  • vscode多文件编程bug记录
  • 分布式答案解析
  • 做耳机套的网站常用网站推广方法的适用性
  • 网站建设增长率呼和浩特建设厅网站
  • AI 音乐工具 Suno 和 Producer 对比
  • KeilIDE背后的命令
  • flash中文网站模板带有flash的网站
  • 阿里云核心服务解析与应用实践
  • Android BaseDexClassLoader源码阅读
  • 笔记本蓝牙怎么开启 完整教程
  • 【Delphi】获取电脑唯一码(一机一码)
  • 钉钉的设计理念方面,我可以学习
  • qq恢复官方网站浅谈海尔的电子商务网站建设
  • 怎么看电脑显卡什么型号?显卡配置方法查看指南
  • 【C#】WinForms 控件句柄与 UI 刷新时机
  • Go语言设计模式:迭代器模式详解
  • 中科大少年班记(2025年11月)
  • 顺德网站建设咨询大连鼎信网站建设公司地址
  • Android15跟踪函数调用关系
  • 公司网络推广网站就选火13星仁德短网址生成算法