业务场景
平时生活中有许多的超时设计,比如购买车票的时候,就有30分钟的支付时间,如果在30分钟内支付,则正常,反之就去掉该订单。
以前的设计方案:有一个监听订单状态的程序,会在30分钟内进行轮询的查询订单状态,但是这样比较消耗性能
这个时候就可以采用消息队列的一个特效:延迟消息
延迟消息
延迟消息就是当消息提供者将消息发送到消息队列以后,并不马上推送给消费者,而是等待指定的时间
以后再推送给消费者,从而达到延迟的效果。
通过延迟消息可以解决超时的这种设计,但是rabbitmq没有延迟消息这个特征,但是我们可以通过设置队列的TTL参数进而达到延迟消息的效果
死信队列
死信队列的特征:没有消费者,只有消息提供者,并且设置有超时时间(毫秒)
通过死信队列实现延迟消息方案
1.采用direct模式
2.创建两个队列,一个正常队列,一个死信队列
3.消息提供者将消息发送到死信对象,而消息消费者读另一个队列的消息
具体实现
- 创建交换机
- 创建队列-正常队列
-
==创建队列-死信队列==
-
绑定队列
- 代码实现
消息提供者:
rabbitTemplate.convertAndSend("delay_exchange","key1","死信消息发送过来了!!!")
消息消费者:
@Component
@Slf4j
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue("queue9"),
exchange = @Exchange(value = "delay_exchange", type = "direct"),
key = {"key2"} //路由参数
)
})
public class DelayQueueModel {
@RabbitHandler
public void msg(String message,Message msg, Channel channel) {
log.info("接收到的延迟消息,message:{}", message);
// TODO 这里进行业务处理,处理延迟消息
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(),false);
} catch (IOException e) {
e.printStackTrace();
}
}
}