首页 > 解决方案 > 应用服务器重启后没有确认/拒绝阻塞通道和代理行为的 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)

标签: javaspring-bootrabbitmqspring-integrationspring-amqp

解决方案


推荐阅读