【问题标题】:Spring AMQP exception handling basicsSpring AMQP 异常处理基础
【发布时间】:2025-12-16 07:00:02
【问题描述】:

我有一个 Listener 类(实现 Spring 的 MessageListener 接口),如果发生异常,我不需要重新排队任何消息,但我想将消息发布到不同的队列。

似乎我需要侦听器来捕获AmqpRejectAndDontRequeueException,但我已经读过我需要它来抛出异常。如果这样做,我将无法重新发布消息。

我应该只捕获一个普通的异常并在那里重新发布吗?有没有必要在那个时候实际抛出AmqpRejectAndDontRequeueException

我想知道这方面的最佳做法。谢谢。

【问题讨论】:

    标签: spring amqp spring-amqp


    【解决方案1】:

    有不同的方法可以实现这一点。

    最简单的,您只需要在客户端捕获所有异常并抛出AmqpRejectAndDontRequeueException

    否则,看看FatalExceptionStrategy,你需要有自己的策略,让它总是返回true

    【讨论】:

    • 谢谢。如果此时我不抛出 AmqpRejectAndDontRequeueException 异常会发生什么?它会重新排队吗?我的配置中没有任何带有 retryInterceptor 的 AdviceChain。我应该只使用死信队列吗?
    • @mstrom 如果您还没有准备好处理异常,为什么需要 DLQ,只需覆盖策略或使用 try catch 块添加或包围您的 handleMessage 方法,这样就可以解决问题
    • 如果您通过发布来处理异常,那么只需使用消息 - 没有异常意味着消息被确认。抛出该异常的唯一真正原因是您使用的是 DLX/DLQ。您还可以使用RepublishMessageRecoverer 配置重试拦截器,它将失败的消息与包含堆栈跟踪等信息的标头一起发布到另一个队列。您还可以将defaultRequeueRejected 设置为 false,以始终拒绝失败的消息,无论异常如何。