繁体   English   中英

Rabbitmq死信交换不起作用导致无限重试

[英]Rabbitmq dead letter exchange not working resulting in infinite retries

我有一个制作人:

rabbitTemplate.convertAndSend(QueueConstants.PROVISIONING_EXCHANGE, QueueConstants.PROVISIONING_ROUTING_KEY, message);

还有我的配置:

@Bean
Queue organizationProvisioningQueue() {
    return QueueBuilder.durable(QueueConstants.PROVISIONING_QUEUE)
            .withArgument("x-dead-letter-exchange", "")
            .withArgument("x-dead-letter-routing-key", QueueConstants.DEAD_LETTER_QUEUE)
            .build();
}

@Bean
Queue deadLetterQueue() {
    return QueueBuilder.durable(QueueConstants.DEAD_LETTER_QUEUE).build();
}

@Bean
DirectExchange exchange() {
    return new DirectExchange(QueueConstants.PROVISIONING_EXCHANGE);
}

@Bean
Binding binding() {
    return BindingBuilder.bind(organizationProvisioningQueue()).to(exchange()).with(QueueConstants.PROVISIONING_ROUTING_KEY);
}

和我的消息处理器:

@RabbitListener(queues = QueueConstants.PROVISIONING_QUEUE)
public void process(ProvisioningMessage message) throws ProvisioningException {
    System.out.println("Processing " + message);

    throw new ProvisioningException ("Some ex " + message);
}

和常数:

public static final String PROVISIONING_EXCHANGE = "provisioning-exchange";
public static final String PROVISIONING_ROUTING_KEY = "provisioning";
public static final String PROVISIONING_QUEUE = "provisioning-queue";

public static final String DEAD_LETTER_QUEUE = PROVISIONING_QUEUE + ".dlq";

死信队列不起作用,因为每次抛出异常后消息都会重新排队,从而导致无限循环而不是进入死信队列。

我已经将我的队列名称更改为以 .dlq 结尾,因为它被建议但仍然没有成功。 我究竟做错了什么?

您需要抛出AmqpRejectAndDontRequeueException或将侦听器容器的defaultRequeueRejected属性设置为false

dlq 的名称无关紧要。

最近我遇到了类似的问题(异常情况下消息的无限重新排队)。 在我的情况下,此应用程序属性的设置解决了问题:

spring.rabbitmq.listener.simple.default-requeue-rejected=false

RabbitMQ 中的毒害消息处理从 RabbitMQ 3.8.0 开始可用,通过使用新类型的队列:Quorum Queues。

在此处输入图片说明

仲裁队列支持对有害消息的处理,即导致消费者重复重新排队传递的消息(可能是由于消费者失败),使得消息永远不会被完全消耗并得到肯定的确认,以便可以被 RabbitMQ 标记为删除.

请注意,仲裁队列目前不支持某些功能:

在此处输入图片说明

仲裁队列会跟踪未成功传递尝试的次数,并将其公开在任何重新传递的邮件中包含的“x-delivery-count”标头中。

可以使用策略参数传递限制为队列设置传递限制。 当一条消息返回的次数超过限制时,该消息将被丢弃或死信(如果配置了 DLX)。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM