阿里云提供了 RabbitMQ 的消息帮助 什么是延时消息_云消息队列 RabbitMQ 版(RabbitMQ)-阿里云帮助中心
对此有说明。
「等待付款」,典型的延迟消息的场景。
延迟消息,就是实现延迟任务场景的「有效逻辑」。
方法: 死信交换机
死信Exchange说明_云消息队列 RabbitMQ 版(RabbitMQ)-阿里云帮助中心
Dead - Letter - Exchange DLX
Dead Letter Exchanges | RabbitMQ 官网信息
// 消费者
/**
* 死信交换机的设置 —— DLX
* @param message
* @throws InterruptedException
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "dlx.queue",durable = "true"),
exchange = @Exchange(name = "dlxdirect.exchange",type = ExchangeTypes.DIRECT,durable = "true"),
key = {"dlx.handshake"}
))
public void receiveDLXListener(String message) throws InterruptedException {
System.out.println("Listener dlx.queue - DLX : " + message + " - " + LocalDateTime.now());
}
// 普通的队列和交换机
// 注意 routingKey 要和消费者保持一致
@Configuration
public class DLXConfigration {
/*
普通的队列和交换机创建
*/
@Bean
public DirectExchange simpleDLXDirectExchange() {
return new DirectExchange("simple-dlxdirect.exchange");
}
@Bean
public Queue simpleDLXDirectQueue() {
// 绑定 dlx 的机制
return QueueBuilder
.durable("simple-dlxdirect.queue")
.deadLetterExchange("dlxdirect.exchange")
.build();
}
@Bean
public Binding simpleDLXBindingOne(DirectExchange simpleDLXDirectExchange, Queue simpleDLXDirectQueue) {
// .with 要和消费者的 routingKey 一致
return BindingBuilder.bind(simpleDLXDirectQueue).to(simpleDLXDirectExchange).with("dlx.handshake");
}
}
结果 : 死信交换机
routing key : exchange 和 queue 一致 。
结果: 普通交换机
routing key : exchange 和 queue 一致 。和 dlx 一致。
此时看到,"simple-dlxdirect.queue" —— 说明设置成功 了。
参数中有一个 DLX
"simple-dlxdirect.queue" 没有设置消费者。
代码
@SpringBootTest
public class DLXSpringAMQPTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void testSimpleDLXMessage() {
// 消息
String message = " Delay message ^ .";
// Delay Send message
rabbitTemplate.convertAndSend("simple-dlxdirect.exchange", "dlx.handshake", message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration("20000");
return message;
}
});
}
}
new 只有一个方法,可以用 lamda 表达式替代。