首页 > 其他分享 >MQ根据正常队列、死信队列来实现延迟队列的场景

MQ根据正常队列、死信队列来实现延迟队列的场景

时间:2024-08-28 11:52:31浏览次数:8  
标签:String exchange 队列 死信 MQ key mq

 

1、在RabbitMQ的管理后台新建交换机(exchange);

  名称(Name): **ParkingExchange**

  类型(Type): **fanout**

  持久化(Durability): **Durable**

2、在RabbitMQ的管理后台新建队列(queue);

  名称(Name): **ParkingQueue**

  类型(Type): **Classic**(新版本RabbitMQ需要选)

  持久化(Durability): **Durable**

  参数设置(Arguments): 

    x-message-ttl = 3000(点下边的Message TTL)

    x-dead-letter-exchange = Ump_mq(点下边的Dead letter exchange, 然后填写Ump_mq)

3、在RabbitMQ的管理后台设置交换机**ParkingExchange**的Binding中的**To Queue**为**ParkingQueue**;

4、以上设置了队列ParkingQueue, 其消息的生命周期为3000毫秒, 即进入此队列的消息3秒会死掉, 死掉的消息会进去dead-letter-exchange为Ump_mq的交换机, 也就是实现了3秒延迟的后半部分.  

 

总结:

  正常队列A、死信队列B进行绑定;

  当数据放入死信队列B,并设置过期时间,数据过期之后,数据会从死信队列B重新放入正常队列A,此时监听器(正常队列A)会监听到消息并消费当前数据;

  

 

代码示例:

    public void pushOrderWxPayDelayData(Long orderId,Long orgId){
        //正常队列的key
        String routingKey = "klota3.0.order.wx.ispay.key.*.*";

        //死信队列的名称
        String delayQueueName = "mq-clota-order-wx-ispay-delay-queue";
        //死信队列的Key
        String delayQueueKey  = "klota3.0.order.wx.ispay.delay.key.*.*";
        try {
            //1、将当前正常队列与死信队列绑定
            rabbitMqManager.declareAndBindQueue(new TopicExchange("mq-clota-notice-topic-exchange"),
                    10, "mq-clota-notice-topic-exchange",routingKey,
                    Collections.singletonMap(delayQueueName, delayQueueKey));
        } catch (Exception e) {
            e.printStackTrace();
        }

        Map<String, Object> headerMap = new HashMap<>();
        headerMap.put("orderId", orderId);
        headerMap.put("orgId", orgId);
        MqSyncVo mqSyncVo = new MqSyncVo();
        mqSyncVo.setMessageId(String.valueOf(orderId));
        mqSyncVo.setSyncType(String.valueOf(orgId));
        /** 推送消息 **/
        Long seconds = 30L;
        String obj = redisUtil.getValue(String.format(RedisKeys.ORDER_WX_ISPAY_COUNT_KEY, orderId, orgId));
        //当前死信队列的key,当前key与上方 delayQueueKey klota3.0.order.wx.ispay.delay.key.*.* 能匹配上
        String delayRoutingKey  = "klota3.0.order.wx.ispay.delay.key.016.909";
        //2、将数据推送到死信队列,30S后过期,30S后过期的数据会从死信队列返回到正常队列,则正常队列中监听到数据会进行消费,则根据正常队列、死信队列来实现了延迟队列的场景
        rabbitMqManager.sendJsonMsgForTranAfterCommit(RabbitMqConst.NOTICE_TOPIC_EXCHANGE, delayRoutingKey, mqSyncVo, headerMap, Duration.ofSeconds(30L), Boolean.FALSE, null);
    }

 

标签:String,exchange,队列,死信,MQ,key,mq
From: https://www.cnblogs.com/jhdhl/p/18384377

相关文章

  • Apache RocketMQ 批处理模型演进之路
    作者:谷乂RocketMQ的目标,是致力于打造一个消息、事件、流一体的超融合处理平台。这意味着它需要满足各个场景下各式各样的要求,而批量处理则是流计算领域对于极致吞吐量要求的经典解法,这当然也意味着RocketMQ也有一套属于自己风格的批处理模型。至于什么样的批量模型才叫“属于......
  • Go使用rocketmq实现简单消息
    注意,当前使用的不是grpc协议生产者packagemainimport( "context" "fmt" "github.com/apache/rocketmq-client-go/v2" "github.com/apache/rocketmq-client-go/v2/primitive" "github.com/apache/rocketmq-client-go/v2/producer&q......
  • Go使用rocketmq实现延迟消息
    生产者packagemainimport( "context" "fmt" "github.com/apache/rocketmq-client-go/v2" "github.com/apache/rocketmq-client-go/v2/primitive" "github.com/apache/rocketmq-client-go/v2/producer" "time&......
  • Apache RocketMQ 中文社区全新升级丨阿里云云原生 7 月产品月报
    云原生月度动态云原生是企业数字创新的最短路径。《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。趋势热点......
  • MQ-2烟雾传感器模块功能实现(STM32)
    烟雾传感器在家庭安全系统中扮演着重要角色,能够及时检测到火灾初期的烟雾,从而保护人们的生命财产安全。MQ-2烟雾传感器是一种广泛使用的传感器,它能够检测多种可燃气体和烟雾。本文将介绍如何使用STM32微控制器来实现MQ-2烟雾传感器模块的功能。实验目的理解MQ-2烟雾传感器......
  • RocketMQ在基金大厂的分布式事务实践
    1行业背景基金公司核心业务主要分为:投研线业务,即投资管理和行业研究业务,体现基金公司核心竞争力市场线业务,即基金公司利用自身渠道和市场能力完成基金销售并做好客户服务随互联网技术发展,基金销售渠道更加多元化,线上成为基金销售重要渠道。相比传统基金客户,线上渠道具有客......
  • 消息队列MQ
    MQ概述1.MQ简介MQ,MessageQueue,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生产、储、消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。2.MQ用途限流削峰MQ可以将系统的超量请求暂存其中,以便系统后期可以慢慢进行处理,从而避免了请求......
  • rabbitmq实现用户关系绑定信息推送
    1.MQ三大要点交换机队列Key2.交换机  交换机是消息队列系统中的一个核心组件,主要用于将消息路由到一个或多个队列中。交换机通过不同的路由规则来决定消息的去向。根据不同的类型,交换机可以有不同的路由策略:直连交换机(DirectExchange):根据消息的路由键(RoutingKey......
  • prometheus学习笔记之PromQL
    一、PromQL语句简介官方文档:https://prometheus.io/docs/prometheus/latest/querying/basics/Prometheus提供⼀个函数式的表达式语⾔PromQL(PrometheusQueryLanguage),可以使⽤户实时地查找和聚合时间序列数据,表达式计算结果可以在图表中展示,也可以在Prometheus表达式浏览器中......
  • 算法与数据结构——队列
    队列队列(queue)是一种遵循先入先出规则的线性数据结构。队列模拟了排队现象,即新来的人不断加入队列尾部,而队列头部的人逐个离开。如图所示,我们将队列头部称为“队首”,尾部称为“队尾”,将把元素加入队列尾部的操作称为“入队”,删除队首元素的操作称为“出队”。队列常用操作......