来源:腾讯云 |2023-02-25 21:07:46 |
延迟队列存储的对象是对应的延迟消息,所谓的延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费
利用RabbitMq
的TTL
和死信队列 来实现延时消费。
(资料图片仅供参考)
如果设置的是队列统一过期时间放到死信队列,没有什么问题。
如果是延时时间设置到每条消息上的。而不是给队列的。
实现方式为消息存活时间为动态用户页面可配置的。
先用一条消息的存活时间是1天。后面又进了一条消息存活时间是1小时。
结果一小时到了,发现这条消息并没有被转发到消费延时过期消息的队列。
原因是尽管ttl是设给每条消息的。但是本质上,所有延时消息都还在一个队列里,对它过期时间的检测也是从头部开始的。
它不会检测每一条消息是否过期。而是顺序检测。
如果first in
的消息过期时间很长,会导致它阻塞后进的消息。
不仅无法实现真正的过期时间。还会导致,一个大的过期时间的先进的消息,会堆积一堆后进的过期时间短的消息。
这个时候可以使用rabbitMq的一个插件:rabbitmq_delayed_message_exchange
一段时间以来,人们一直在寻找用RabbitMQ实现延迟消息的传递方法,到目前为止,公认的解决方案是混合使用TTL和DLX。而rabbitmq_delayed_message_exchange插件就是基于此来实现的,RabbitMQ延迟消息插件新增了一种新的交换器类型,消息通过这种交换器路由就可以实现延迟发送
需要根据自己的rabbitMq选择对应的版本。我rabbitMq的版本是RabbitMQ 3.11.0
,对应的插件版本就是:3.11.1
--1、cd到rabbitmq默认安装位置cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.18/plugins--2、通过ftp工具将插件上传到此目录下--3、开启插件rabbitmq-plugins enable rabbitmq_delayed_message_exchange--4、重启MQ服务systemctl restart rabbitmq-server
--1、通过ftp工具将插件上传到Linux服务器的根目录下--2、拷贝到docker中rabbitmq插件目录下,rabbitmq_delayed_message_exchange-3.9.0.ez(下载包的全名)docker cp /rabbitmq_delayed_message_exchange-3.9.0.ez 容器ID:/plugins--3、进入容器docker exec -it 容器id /bin/bash--4、查看插件是否存在(确保2中的操作已经将插件拷贝过来了)cd pluginsls |grep delay--5、开启插件rabbitmq-plugins enable rabbitmq_delayed_message_exchange--6、退出容器exit--7、重启MQ服务docker restart 容器ID
web界面新建交换机选择类型出现红框标注即表示成功
@Configurationpublic class DelayRabbitmqConfig { /** * 声明延迟队列 * @return */ @Bean public Queue delayQueue(){ return new Queue(QueueConstant.DelayQueue, true,false,false); } /** * 声明延迟自定义交换机类型 * @return */ @Bean public CustomExchange delayCustomExchange(){ HashMap args = new HashMap<>();// 设置 x-delayed-type 为 direct,当然也可以是 topic 等 发送消息时设置消息头 headers 的 x-delay 属性,即延迟时间,如果不设置消息将会立即投递 args.put("x-delayed-type","direct"); return new CustomExchange(ExchangeConstant.DelayCustomerExchange, "x-delayed-message",true,false,args); } /** * 绑定延迟交换机和队列 * @return */ @Bean public Binding delayQueueAndCustomExchange(){ return BindingBuilder.bind(delayQueue()) .to(delayCustomExchange()).with(RoutingKeyConstant.DelayCustomerRoutingKey).noargs(); }}
引入依赖: xmlns:util="http://www.springframework.org/schema/util" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd
//消息发送final MessagePostProcessor messagePostProcessor = new MyMessagePostProcessor(Integer.valueOf(ttl.toString()));DisTimingPushDto disTimingPushDto = new DisTimingPushDto();disTimingPushDto.setOrderId(dispense.getOrderId());disTimingPushDto.setPushTime(disDispense.getPushTime());rabbitTemplate.convertAndSend(MsgQueueEnum.TIMING_PUSH.getExchangeName(), MsgQueueEnum.TIMING_PUSH.getQueueName(), disTimingPushDto, messagePostProcessor);//每条消息时间配置import org.springframework.amqp.AmqpException;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessagePostProcessor;/** * 延迟消息处理器 Processor * @author king * @date 2022年12月28日 11:14 */public class MyMessagePostProcessor implements MessagePostProcessor { /** * 消息延迟时间,单位:毫秒 */ private final Integer TTL; public MyMessagePostProcessor(final Integer ttl) { this.TTL = ttl; } @Override public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setDelay(TTL); return message; }}
责任编辑:【henankuaibao】
关键词: RabbitMQ
原因是尽管ttl是设给每条消息的。但是本质上,所有延时消息都还在一个队列里,对它过期时间的检测也是从头部开始的。
辽宁男篮主教练杨鸣:克服困难做好球队磨合---新华社沈阳2月24日电(记者潘昱龙)辽宁男篮24日在主场进行了公开训练,主教练杨鸣表示球队目前
曹德旺宴请一位日本商人,才喝1杯酒,日本商人扑通一下就跪下了,日本,福耀,曹德旺,任正非,王健林,心若菩提,成功人士
1、Vmware是我们经常使用的一种虚拟机软件,但是有时候在运行虚拟机的时候会提示“内部错误”,无法打开虚拟机。这时候有
身份证办理(首次申领)一、办理条件1、本市户籍:为上海市常住户口公民2、外省市户籍:上海公安机关在全市范围推开全国范围首次申领居民身份
》》》最新消息:2月24日,“平安东丽”微信公众号发布关于公安东丽分局关于分局人口服务管理中心搬迁的公告,具体如下:公安东丽分局人口服...
经小编咨询0571-12333医保工作人员,得到回复:生育津贴发放依然按照用人单位申报的月平均工资÷30×应计发天数来计算。高出部分单位有条件可
早孕期胎儿结构超声筛查、胎儿系统彩色多普勒超声检查可按规定在医保定点医疗机构直接结算;调整后的分娩镇痛项目因信息技术问题暂不能直接结
考试时间2023年2月18日、19日8时30分—14时,上午场750人,下午场450人。考试地点杭州市教育发展服务中心(杭州市重机巷56号)。报考须知1 测试采
查询方式:点击进入全国普通话培训测试信息资源网,点击首页报名入口,再点击打印准考证,输入个人信息即可查询。报考须知1 测试采用大机房机
导读:最近很多玩家都在关注逃离后宫这款手游,想知道具体的公测时间,逃离后宫会经过封测、删档内测、不删档测试到最终的公测等几个测试阶段
2023第133届广交会时间和展品有哪些?第一期:2023年4月15日—19日;参展范围:电子及家电、电子消费品、照明、车辆及配件、机械、五金工具、建
(1)《广东省卫生健康行业职业技能鉴定个人申请表》(报名系统导出打印,经本人签字确认,一式二份),报考开始时,报考人员在系统填报;(2)报考人
2023广州文旅消费券路演派消费券活动在哪里举行?☑领券地址:广百百货(北京路店)南门☑适用范围:广百百货、新大新国风、天河城百货(均为北京
问:广州人才引进入户要居住证吗?答:不需要居住证。人才入户办理材料如下:(系统须上传原件彩色扫描件,扫描件内容须完整清晰可见,支持的附
领取方式补贴兑现流程:顾客交清车款——企业开具发票——税务部门审核——审核通过顾客交清剩余车辆购置税——参与促销企业向商务局备案。...
自2022年10月1日起,芜湖市住房公积金管理中心对首套个人住房公积金贷款利率进行调整:1、自2022年10月1日起,下调首套个人住房公积金贷款利率
2023广州黄埔波罗诞庙会怎么预约?预约时间:南海神庙:提前一个月预约广州海事博物馆:提前19天预约预约入口:※特别提醒:南海神庙与广州海
2023广东高考舞蹈术科统考本专科合格线为150分。舞蹈类考生术科统考成绩达到相应的合格线,方可报考对应层次的省术科统考或省术科统考涵盖校考
2023广州新生儿出生“一件事”办理流程:1 打开“穗好办”APP“办事”页面进入“更多服务”专题,点击“医疗服务”;(点击查看大图)2 在...