当前位置: 首页 > news >正文

设计网站app西安市建设工程信息网招投标平台

设计网站app,西安市建设工程信息网招投标平台,贵州 跨境电商网站建设,wordpress查看所有文章RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中,消费者不会立即收到消息,而是过一段时间之后才会收到消息,进行处理。在一些业务中,可以用到延…

RabbitMQ延迟队列的实现

  • 延迟消息是什么
    • 延迟消息的实现
    • 死信交换机
      • 代码实现
    • 延迟消息插件


延迟消息是什么

延迟消息是将消息发送到MQ中,消费者不会立即收到消息,而是过一段时间之后才会收到消息,进行处理。在一些业务中,可以用到延迟消息,比如我们在成功下单一个商品后,需要立即付款,为了避免商品库存一直被占有,我们会给商品设置一个支付时间,如果在这段时间没有支付成功,就会恢复库存,删除订单,对于订单支付的超时删除我们是通过延迟消息来实现的,让消费者在支付超时之后查询用户是否支付,如果支付成功直接返回,如果支付失败就恢复库存删除订单。

延迟消息的实现

延迟消息由以下两种方式实现,第一种是通过绑定死信交换机实现,第二种通过延迟消息插件实现,推荐使用第二种,更加简单

死信交换机

满足以下三种情况之一的叫做死信:
1、在设置了过期时间的消息,放入队列中,超过了过期时间没有被处理的消息
2、消息消费失败(返回nack或者reject)并且不能重复入队
3、队列消息堆积满了,最早的消息叫做死信
我们可以给队列绑定参数指定交换机,那么死信会被投递到指定交换机。
消息队列实现原理:我们可以设置一组没有消费者的交换机和队列,设置另一组处理绑定死信的交换机、队列和消费者,来处理延迟消息。

代码实现

定义死信交换机等和消费延迟消息交换机等:


@Configuration
public class DelayConfiguration {/*** 定义死信交换机、队列以及绑定*/@Beanpublic DirectExchange exchange() {return new DirectExchange("dead.direct");}@Beanpublic Queue queue() {Queue queue = new Queue("dead.queue");queue.addArgument("x-dead-letter-exchange", "delay.direct");return queue;}@Beanpublic Binding binding() {return BindingBuilder.bind(queue()).to(exchange()).with("dead");}/*** 定义处理延迟消息的交换机、队列和绑定*/@Beanpublic DirectExchange exchange1() {return new DirectExchange("delay.direct");}@Beanpublic Queue queue1() {return new Queue("delay.queue");}@Beanpublic Binding binding1() {return BindingBuilder.bind(queue1()).to(exchange1()).with("dead");}
}

定义延迟消息监听器:

    @RabbitListener(queues = "delay.queue")public void listen(String msg){log.info(LocalDateTime.now()+": "+msg);}

测试:

@Testvoid sendDeadMsg() {rabbitTemplate.convertAndSend("dead.direct", "dead", "我是死信", new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {
//                设置过期消息时间message.getMessageProperties().setExpiration("10000");return message;}});}

结果:
在这里插入图片描述
在这里插入图片描述
消费者在十秒钟后成功消费延迟消息

延迟消息插件

我们在之前通过死信交换机来实现延迟队列,但是死信交换机是专门用来存放无法处理的消息,并且使用死信交换机实现过于复杂,我们需要手动定义两个交换机和队列,因而RabbitMQ提供了延迟消息插件来让我们更简单的实现延迟消息。
原理:给消息设置延迟时间,当将消息放入MQ时,MQ的交换机不会立即将消息放入队列,而是会在交换机中暂存延迟时间过后将消息路由到队列中,可以让队列处理延迟消息。
安装插件:插件安装可以借鉴这篇博客
代码实现
消费者:

    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "delay.queue",durable = "true"),// 开启延迟交换机exchange = @Exchange(name = "delay.direct",delayed = "true"),key = "dead"))public void listen(String msg){log.info(msg);}
  @Testvoid sendDeadMsg() {rabbitTemplate.convertAndSend("delay.direct", "delay", "我是死信", new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {
//                设置延迟消息时间message.getMessageProperties().setDelay(10000);return message;}});}
http://www.yayakq.cn/news/188025/

相关文章:

  • 网站的功能和特色网上购书的网站开发的意义
  • 山东省建设部继续教育网站哈尔滨大型网站开发
  • 给网站网站做推广贵州小程序制作开发
  • 深圳汽车网站建设官方网站平台有哪些
  • 洛阳做网站公司哪家好商业网站建设设计
  • 大濮网最新濮阳消息新闻类网站怎么做seo
  • 谷歌网站收录提交入口郴州网站建设网络推广平台
  • 介休城乡建设网站wordpress 404插件
  • 网站 可信验证做图骂人的图片网站
  • 山东建设工会网站编程工具
  • 三门峡网站建设电话kfk wordpress
  • 做文案策划需要用到的网站个人网站毕业设计作品
  • 给境外合法网站做数据建设网站出现400错误
  • 常州高端网站制作公司排名网站怎样优化文章关键词
  • ps海报素材网站python配合wordpress
  • 装修网站大全网站系统名称怎么填
  • 郑州网站设计制作微信官网网页版登录入口
  • 做网站的流程百科门户网站怎么建设需要多长时间
  • 建设银行网站无法访问中小企业网络需求分析
  • 有什么做详情页的参考网站谷歌应用商店下载
  • 营销型网站的重要特点珠海网站建设制作哪家专业
  • 大连云建站模板网站运营是什么岗位
  • vue大型网站开发吗购物网站建设咨询
  • 怎么把网站制作成app佛山互联网公司
  • 网站文章页的排名怎么做dw如何在网站做弹窗
  • 学校网站建设价格做网站代理属于开设赌场罪吗
  • 小型网站建设公司价格低大连万词推广
  • 国外最火的网站林州网站建设价格
  • 郑州高端网站百度沈阳分公司地址在哪里
  • 织梦网站首页模板更换如何查公司的工商注册信息