我对 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 小时(消耗一次按摩需要几秒)
查看此文档:https://www.rabbitmq.com/dlx.html
请注意,队列过期不会死信其中的消息。
所以,我们确实不能从过期队列中对消息进行 DLX。 考虑在队列定义上使用
x-message-ttl
而不是 x-expires
.