场景
消费者接受消息,进行一系列处理,但是由于某些原因处理过程中该消费者的抛出了异常,并且不捕获(直接 throws IOException 抛出去);
由于抛出了IOException,那么这条消息就会再次被发送到该队列,消费者就再次收到,而消费者抛出异常,该消息又会入队……所以就形成了一个死循环(除非不再有类似IO的异常),那么控制台日志就一直打印该消费者的抛出异常。
所以,如果不需要消费者抛出异常后消息重新入队,就需要将异常捕获。
下面模拟消费者收到一条消息,抛出IOException 没有捕获
控制台一直抛出异常,打印堆栈
就算把这个消费者停了,然后再启动这个消费者依然后报错,因为这个队列的消息一直没有被该消费者消费。
解决办法:当消费者把该异常内部捕获了,不再抛出去
保险起见,可以把整个方法体的内容进行try,然后捕获异常,具体操作如下:
public void consumerMethod(Param param){ try{ // 比如解析body,业务操作 } catch(IOException e){ // 比如打印日志,异常堆栈 } catch(NullPointerException e){ // 比如打印日志,异常堆栈 } catch(Exception e){ // 比如打印日志,异常堆栈 } }
就只会进入catch打印一次堆栈,该队列的消息就被该消费者消费了。
限制消息因为异常重复入队的次数
抛出AmqpRejectAndDontRequeueException异常
抛出这个异常后,表示该消费者监听的队列不要因为抛出AmqpRejectAndDontRequeueException异常而消息重复入队;
控制台也只打印了该错误日志,该队列刚收到的消息已被该消费者消费。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架