专栏导航
目录
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了死信交换机、死信交换机实现延迟消息等内容。
死信交换机在 RabbitMQ 中是一个非常重要的概念,它主要用于处理那些在队列中无法正常处理的消息。
在 RabbitMQ 中,当一个消息在队列中满足以下条件时,它会被标记为死信:
死信交换机的主要作用是集中处理无法正常处理的消息:
收集那些因处理失败而被拒绝的消息。
收集那些因队列满了而被拒绝的消息。
收集因TTL(有效期)到期的消息。
当一个队列中的消息成为死信后,如果这个队列通过dead-letter-exchange属性指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机就称为死信交换机。通过这种方式,可以将各种原因导致的失败消息集中到一个特定的地方,以便于分析和处理。
案例模型:
案例分析:
在RabbitMQ管理控制台新建交换机dlx.direct:
在RabbitMQ管理控制台新建队列dlx.queue:
绑定队列到交换机,指定RoutingKey:
在RabbitMQ管理控制台新建交换机simple.direct:
在RabbitMQ管理控制台新建队列simple.queue,并通过dead-letter-exchange属性指定交换机(队列中的死信就会投递到这个交换机中,这个交换机称为死信交换机):
查看新建结果:
绑定队列到交换机,指定RoutingKey:
在consumer服务的类中添加新的方法,作为消费者进行消息接收:
@RabbitListener(queues = "dlx.queue")
public void listenDlxQueue(String msg){
log.info("dlx.queue:" + msg);
}
在publisher服务中的测试类添加一个测试方法,设置RoutingKey为dead,设置消息的 TTL 为 10000 毫秒(10秒),实现消息发送:
@Test
void testSendTTLMessage() {
rabbitTemplate.convertAndSend("simple.direct", "dead", "Dead letter test", new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("10000");
return message;
}
});
log.info("消息发送成功!");
}
运行结果(Publisher服务成功发送了一条消息,但Consumer服务在10秒后才收到该消息,从而实现了延迟消息传递的目标):
RabbitMQ是一个开源的消息队列软件,旨在提供可靠的消息传递和消息队列功能。本文主要介绍了死信交换机、死信交换机实现延迟消息等内容,希望对大家有所帮助。