RabbitMQ - 在使用参数'x-expires'删除队列后将消息转发到另一个队列

问题描述 投票:0回答:1

我对 rabbitMQ 配置有疑问。我想在 RabbitListener(失去网络连接或有人关闭应用程序)关闭后 20 分钟将队列中的所有消息转发到另一个队列。

我试着这样做(在春天):

@Configuration public class RabbitMqConfig { 

    ... 
    @Bean public Queue deadQueue(){ 
        return new Queue("dead_letter_queue", true, false, false);
    }
    
    @Bean
    public Binding deadQueueBinding(){
        Binding binding = new Binding(
                "dead_letter_queue",
                Binding.DestinationType.QUEUE,
                "dlx_exchange",
                "dlx_key",
                null
        );
        return binding;
     }
    ...

}
@Service
public class QueueManagerService {
...
    public void createQueue(String queueName) {
        Map<String, Object> args = new HashMap<>();
        args.put("x-max-priority", 10); 
        args.put("x-expires", 30000);
        args.put("x-dead-letter-exchange", "dlx_exchange");
        args.put("x-dead-letter-routing-key", "dlx_key");
        Binding binding = new Binding(
                queueName,
                Binding.DestinationType.QUEUE,
                "exchange4allQueuesName",
                queueName, //routingKey dajemy ten sam jaki nazwa kolejki
                null
        );
        rabbitAdmin.declareQueue(new Queue(queueName, true, false, false, args));
        rabbitAdmin.declareBinding(binding);
    }
...
}

似乎参数“x-expires”不能与参数“x-dead-letter-exchange”和“x-dead-letter-routing-key”一起使用。我需要一些建议或其他方式如何从队列转发消息。

我不能也不想在每条消息上使用参数'x-message-ttl',因为消息可以在队列中等待消耗甚至 1 小时(消耗一次按摩需要几秒)

rabbitmq spring-rabbit
1个回答
0
投票

查看此文档:https://www.rabbitmq.com/dlx.html

请注意,队列过期不会死信其中的消息。

所以,我们确实不能从过期队列中对消息进行 DLX。 考虑在队列定义上使用

x-message-ttl
而不是
x-expires
.

© www.soinside.com 2019 - 2024. All rights reserved.