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

7eumitmz  于 2023-02-22  发布在  RabbitMQ
关注(0)|答案(1)|浏览(263)

我有一个问题与rabbitMQ配置。我想转发所有消息从队列到另一个队列后20分钟rabbitListener(失去网络连接或有人关闭应用程序)关闭。
我试着这样做(在Spring):

@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小时(消耗一条消息需要几秒钟)

omqzjyyz

omqzjyyz1#

参见本文档:https://www.rabbitmq.com/dlx.html
注意,队列的过期不会使其中的消息成为死信。
因此,我们确实不能从过期队列中DLX消息。考虑在队列定义中使用x-message-ttl而不是x-expires

相关问题