Redisson 延时队列 监听线程中调用 return 造成线程终止 消息积压 无法被消费

本文主要是介绍Redisson 延时队列 监听线程中调用 return 造成线程终止 消息积压 无法被消费,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

博文目录

文章目录

  • 结论
  • 过程
  • 流程


结论

单线程 while(true) 监听 Redisson 延时队列有几个注意点

  • 死循环内必须加 try-catch 捕获 Throwable, 防止报错终止线程
  • 明确线程方法体死循环内的 return 语句是否会导致方法体执行结束, 进而导致线程终止, 考虑是否需要以 continue 替代

生产上线不要夹带私货, 私货往往没有经过完整的测试流程验证, 容易出问题

过程

开发使用 Redisson 延时队列, 完成编码后, 自测没有问题, 在发版时以夹带私货的方式上线了, 在生产运行中出现消息消息无法消费的情况

原因是在线程方法体中有一些条件判断, 当消息不符合条件的时候, 会通过 return 阻断流程执行. 开发自测时模拟的数据有限, 且都没有走到阻断分支, 所以没有发现问题. 而生产上有一些数据会走到阻断流程, 执行 return 导致线程方法体退出死循环并执行结束, 最终导致线程终止, 无法再继续监听消息

流程

Redisson (3.17.7) 延时队列 利用 Redis List 和 ZSet 以及 发布/订阅 功能实现, 整个过程会涉及到 3 个 Key

  • 阻塞队列: redisson_delay_queue:{test}, 是一个 List, 通过阻塞操作 take 读取数据
  • 延时队列: redisson_delay_queue_timeout:{test}, 是一个 ZSet, 通过 offer 写入数据
  • 普通队列, test, 是一个 List, 当消息积压时, 可能会把积压消息转存进来

监听线程死循环 take 阻塞队列, 当延时队列中的消息到期, 会被转存到阻塞队列共监听线程消费, 如果一定时间内未消费, 则会创建普通队列, 并把消息转存进去, 待监听线程重新上线, 先读取普通队列内的消息, 读取完后会删除普通队列, 再阻塞读取阻塞队列内的消息

这篇关于Redisson 延时队列 监听线程中调用 return 造成线程终止 消息积压 无法被消费的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640262

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

SpringBoot整合Canal+RabbitMQ监听数据变更详解

《SpringBoot整合Canal+RabbitMQ监听数据变更详解》在现代分布式系统中,实时获取数据库的变更信息是一个常见的需求,本文将介绍SpringBoot如何通过整合Canal和Rabbit... 目录需求步骤环境搭建整合SpringBoot与Canal实现客户端Canal整合RabbitMQSp

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(