死信队列

微信扫一扫,分享到朋友圈

死信队列

业务场景

平时生活中有许多的超时设计,比如购买车票的时候,就有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();
}
}
}
复制代码

新型电子“隐形墨水”:能在芯片遭篡改时向用户发出警告

上一篇

家庭烧烤时突然爬来50多只大螃蟹:味道极其鲜美 可惜不能吃

下一篇

你也可能喜欢

死信队列

长按储存图像,分享给朋友