java - 应用服务器重启后没有确认/拒绝阻塞通道和代理行为的 RabbitMQ 消息
问题描述
我正在使用 AcknowledgeMode.MANUAL 通知代理消息的状态。有时,由于连接问题,处理程序无法完成 basicAck 或 basicNack 方法。在关闭信号并重新启动消费者后,队列中不会弹出任何消息。在我看来,它可能是 preFetched 属性的结果,它被分配了 1。从代理的角度来看,消息仍然以未确认的形式出现在 Channel 中,因此它正在等待传输新消息。消费者处理了相应的交付标签,正在等待下一条消息。
当应用程序服务器重新启动时,消费者按预期工作。这是另一个问题,如果新的连接被创建到代理,之前未确认的消息将被重新排队或放入死队列?
这是导致重置消费者的stacktace:
com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(reply-code=320, reply-text=CONNECTION_FORCED - connection expired, class-id=0, method-id=0)
at com.rabbitmq.client.impl.AMQConnection.startShutdown(AMQConnection.java:916)
at com.rabbitmq.client.impl.AMQConnection.shutdown(AMQConnection.java:906)
at com.rabbitmq.client.impl.AMQConnection.handleConnectionClose(AMQConnection.java:844)
at com.rabbitmq.client.impl.AMQConnection.processControlCommand(AMQConnection.java:799)
at com.rabbitmq.client.impl.AMQConnection$1.processAsync(AMQConnection.java:242)
at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:178)
at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:111)
at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:650)
at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:597)
at java.base/java.lang.Thread.run(Thread.java:834)
解决方案
推荐阅读
- azure - 如何为相同资源类型的多个资源创建不同的指标类型警报
- python - 如何解析 Airflow 中的嵌套宏
- c# - 如何使用 c# 运行 exe 文件(我不能使用 Process.Start() 因为我不知道 exe 文件的位置)
- java - JSF @Inject 机制返回 NullPointerException
- python-3.x - 如何让 Python 什么都不做
- python - 无需训练模型的人指甲分割
- css - 无法让我的动态 CSS 与 Vue.js 一起使用
- sql - 来自相同输出的对象总和
- java - 在单击侦听器回调中获取活动上下文
- regex - Bash - 按模式从 HTML 中提取 URL