【问题标题】:Concept dead letter exchange not working in my environment概念死信交换在我的环境中不起作用
【发布时间】:2023-11-11 01:11:01
【问题描述】:

我尝试在我的 java 代码中使用带有注释的死信交换。也许我的假设是错误的,它应该如何工作。但是在我的方法 processMpcMessage 中,我将消息从队列反序列化为 POJO。如果我收到 IllegalargumentException,我希望将消息放入死信队列。我配置了死信交换和路由键,请参阅我的代码示例。 如果我抛出“throw new AmqpRejectAndDontRequeueException(msg, exception);”我希望我之前消费的消息被放入死信队列。 我得到了以下调试消息:

2019-02-07 13:35:42,009 [SimpleAsyncTaskExecutor-1] DEBUG {} - org.springframework.amqp.rabbit.listener.BlockingQueueConsumer - 拒绝消息(requeue=false)

欢迎任何建议 问候 德克

    @RabbitListener(bindings = @QueueBinding(
                                value = @Queue(
                                        value = "${mpc.inbound.receive.queue}",
                                        durable = "true",
                                        arguments = {
                                                @Argument(name = "x-dead-letter-exchange", value = "${mpc.inbound.dead.letter}"),
                                                @Argument(name = "x-dead-letter-routing-key", value = "${mpc.inbound.receive.error.routing.key}"),
                                                @Argument(name = "defaultRequeueRejected", value = "false")
                                        }),
                                        exchange = @Exchange(value = "${mpc.inbound.exchange}",
                                        type = ExchangeTypes.TOPIC, durable = "true"),
                                        key = "${mpc.inbound.routing.key}"
                                ))
public void processMPCMessage(final Message message) {
//Here the message is deserialized in to a java object and this is where I want to throw a exception. 
try{
}catch(IllegalArgumgenException ex){
    throw new new AmqpRejectAndDontRequeueException(" a error message", ex);
}


}

【问题讨论】:

    标签: rabbitmq spring-amqp


    【解决方案1】:

    队列是否已经存在?

    队列是幂等的;创建它们后,您无法更改它们的属性(参数)。先将其删除,以便重新创建。

    如果不是这样,请打开 DEBUG 日志记录以查看发生了什么。

    【讨论】:

    • 队列确实存在。调试已打开,我可以看到应用程序已连接到队列。我在日志中没有看到死信交换和路由密钥信息。在 rabbitmq 中,参数在队列中可用
    • Rejecting messages (requeue=false) 好吧,显然消息被拒绝而不是重新排队;所以要么路由键错误,要么没有使用该路由键绑定到 DLX 的队列。
    • 我将其全部配置为全新,现在开始工作。换句话说,我的 RabbitMQ 环境是网格化的。感谢您的建议
    • 对此还有一点需要注意,不是问题的解决方案,而是代码中的一个错误。参数@Argument(name = "defaultRequeueRejected", value = "false") 不是应该在队列中设置的东西,而是作为弹簧启动属性spring.rabbitmq.listener.simple.default-requeue-rejected: false 并且在这种情况下不需要抛出 AmqpRejectAndDontRequeueException 异常