我有个制片人:
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结尾,因为有人建议这样做,但仍然没有成功。我做错了什么?
发布于 2020-03-16 22:00:44
您需要抛出AmqpRejectAndDontRequeueException
或将侦听器容器的defaultRequeueRejected
属性设置为false
。
dlq的名称无关紧要。
发布于 2020-03-28 04:57:32
最近我遇到了类似的问题(异常情况下消息的无限重复)。在我的案例中,这个应用程序属性的设置解决了问题:
spring.rabbitmq.listener.simple.default-requeue-rejected=false
发布于 2020-04-01 01:46:33
RabbitMQ中的有害消息处理通过使用新的队列类型:法定队列,可以从RabbitMQ 3.8.0开始使用。
Quorum queue支持对有毒消息的处理,即导致消费者反复重新排队传递(可能是由于消费者故障)的消息,使得消息永远不会被完全消费并得到肯定的确认,从而可以由RabbitMQ标记为删除。
请注意,法定队列当前不支持某些功能:
Quorum队列跟踪不成功的传递尝试的次数,并在任何重新传递的消息中包含的"x- delivery -count“标头中公开它。
可以使用策略参数delivery-limit为队列设置传递限制。当一条消息的返回次数超过限制时,该消息将被丢弃或死信(如果配置了DLX )。
https://stackoverflow.com/questions/60703733
复制相似问题