使用 Spring AMQP 时如何正确处理 RabbitMQ 通道上 basicAck 的 IOException?
How to properly handle IOException for basicAck on RabbitMQ Channel when using Spring AMQP?
当使用 Spring AMQP 声明这样的方法时:
@RabbitListener(..)
public void myMethod(@Header(AmqpHeaders.CHANNEL) Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) Long tag, ...)
并且使用手动确认方式,应该如何正确处理在进行ACK时可能抛出的IOException
:
try {
channel.basicAck(tag, false);
} catch (IOException e) {
// What to do here?
}
是否应该重新抛出异常?是否应该重试 "basicAck" 操作?正确的处理方式是什么?
执行此操作的标准方法是使用重试机制,如果 none 个成功则重试。
但是,根据我的经验,如果通道抛出异常,或多或少意味着通道无用,您可能需要重新进行整个操作。我通常会记录错误以及所需的详细信息,以便我可以跟踪哪个消息处理失败,以便我可以稍后验证相同的消息以查看它是否已处理或我需要对此做任何事情。
当使用 Spring AMQP 声明这样的方法时:
@RabbitListener(..)
public void myMethod(@Header(AmqpHeaders.CHANNEL) Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) Long tag, ...)
并且使用手动确认方式,应该如何正确处理在进行ACK时可能抛出的IOException
:
try {
channel.basicAck(tag, false);
} catch (IOException e) {
// What to do here?
}
是否应该重新抛出异常?是否应该重试 "basicAck" 操作?正确的处理方式是什么?
执行此操作的标准方法是使用重试机制,如果 none 个成功则重试。
但是,根据我的经验,如果通道抛出异常,或多或少意味着通道无用,您可能需要重新进行整个操作。我通常会记录错误以及所需的详细信息,以便我可以跟踪哪个消息处理失败,以便我可以稍后验证相同的消息以查看它是否已处理或我需要对此做任何事情。