城市直播房产教育博客汽车
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

RabbitMQ的消息确认机制(含代码实现)

1月5日 火凤派投稿
  哈喽大家好,我是阿Q!
  上文,我们已经完成了SpringBoot快速集成RabbitMQ的小Demo,本文我们来聊一下RabbitMQ为了防止消息丢失,增加的消息确认机制:生产者消息确认机制和消费者消息确认机制。确认机制
  一、生产者消息确认机制在yml中增加配置信息spring:rabbitmq:确认消息已发送到交换机(Exchange)publisherconfirmtype:correlated确认消息已发送到队列(Queue)publisherreturns:true
  spring。rabbitmq。publisherconfirm新版本已被弃用,现在使用spring。rabbitmq。publisherconfirmtypecorrelated实现相同效果增加回调BeanpublicRabbitTemplatecreateRabbitTemplate(ConnectionFactoryconnectionFactory){RabbitTemplaterabbitTemplatenewRabbitTemplate();rabbitTemplate。setConnectionFactory(connectionFactory);设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数rabbitTemplate。setMandatory(true);rabbitTemplate。setConfirmCallback(newRabbitTemplate。ConfirmCallback(){Overridepublicvoidconfirm(CorrelationDatacorrelationData,booleanack,Stringcause){System。out。println(ConfirmCallback:相关数据:correlationData);System。out。println(ConfirmCallback:确认情况:ack);System。out。println(ConfirmCallback:原因:cause);}});rabbitTemplate。setReturnsCallback(newRabbitTemplate。ReturnsCallback(){OverridepublicvoidreturnedMessage(ReturnedMessagereturned){System。out。println(ReturnCallback:消息:returned。getMessage());System。out。println(ReturnCallback:回应码:returned。getReplyCode());System。out。println(ReturnCallback:回应信息:returned。getReplyText());System。out。println(ReturnCallback:交换机:returned。getExchange());System。out。println(ReturnCallback:路由键:returned。getRoutingKey());}});returnrabbitT}confirm机制是只保证消息到达exchange,并不保证消息可以路由到正确的queue当前的exchange不存在或者指定的路由key路由不到才会触发return机制
  大家可以自行演示以下情况的执行结果:不存在交换机和队列存在交换机,不存在队列消息推送成功
  二、消费者消息的确认机制
  默认情况下如果一个消息被消费者正确接收则会从队列中移除。如果一个队列没被任何消费者订阅,那么这个队列中的消息会被缓存,当有消费者订阅时则会立即发送,进而从队列中移除。
  消费者消息的确认机制可以分为以下3种:自动确认
  AcknowledgeMode。NONE默认为自动确认,不管消费者是否成功处理了消息,消息都会从队列中被移除。根据情况确认
  AcknowledgeMode。AUTO根据方法的执行情况来决定是否确认还是拒绝(是否重新入队列)如果消息成功被消费(成功的意思是在消费的过程中没有抛出异常),则自动确认当抛出AmqpRejectAndDontRequeueException异常的时候,则消息会被拒绝,且消息不会重回队列当抛出ImmediateAcknowledgeAmqpException异常,则消费者会被确认其他的异常,则消息会被拒绝,并且该消息会重回队列,如果此时只有一个消费者监听该队列,则有发生死循环的风险,多消费端也会造成资源的极大浪费,这个在开发过程中一定要避免的。可以通过setDefaultRequeueRejected(默认是true)去设置
  可能造成消息丢失,一般是需要我们在trycatch捕捉异常后,打印日志用于追踪数据,这样找出对应数据再做后续处理。手动确认
  AcknowledgeMode。MANUAL对于手动确认,也是我们工作中最常用到的,它的用法如下:肯定确认deliveryTag:消息队列数据的唯一idmultiple:是否批量true:一次性确认所有小于等于deliveryTag的消息false:对当前消息进行确认;channel。basicAck(longdeliveryTag,booleanmultiple);否定确认multiple:是否批量true:一次性拒绝所有小于deliveryTag的消息false:对当前消息进行确认;requeue:被拒绝的是否重新入列,true:就是将数据重新丢回队列里,那么下次还会消费这消息;false:就是拒绝处理该消息,服务器把该消息丢掉即可。channel。basicNack(longdeliveryTag,booleanmultiple,booleanrequeue);用于否定确认,但与basicNack相比有一个限制,一次只能拒绝单条消息channel。basicReject(longdeliveryTag,booleanrequeue);手动确认
  在yml配置中开启手动确认模式spring:rabbitmq:listener:simple:acknowledgemode:manual
  或者在代码中开启ConfigurationpublicclassMessageListenerConfig{AutowiredprivateCachingConnectionFactoryconnectionFAutowiredprivateMQRecievermqR消息接收处理类BeanpublicSimpleMessageListenerContainersimpleMessageListenerContainer(){SimpleMessageListenerContainercontainernewSimpleMessageListenerContainer(connectionFactory);并发使用者的数量container。setConcurrentConsumers(1);消费者人数上限container。setMaxConcurrentConsumers(1);container。setAcknowledgeMode(AcknowledgeMode。MANUAL);RabbitMQ默认是自动确认,这里改为手动确认消息设置一个队列,此处支持设置多个container。setQueueNames(directQueue);container。setMessageListener(mqReciever);}}
  消息消费类ComponentRabbitListener(queuesdirectQueue)监听队列名称publicclassMQRecieverimplementsChannelAwareMessageListener{OverridepublicvoidonMessage(Messagemessage,Channelchannel)throwsException{longdeliveryTagmessage。getMessageProperties()。getDeliveryTag();try{Stringmsgmessage。toString();String〔〕msgArraymsg。split();可以点进Message里面看源码,单引号直接的数据就是我们的map消息数据System。out。println(消费的消息内容:msgArray〔1〕);System。out。println(消费的主题消息来自:message。getMessageProperties()。getConsumerQueue());业务处理。。。。。。channel。basicAck(deliveryTag,true);}catch(Exceptione){拒绝重新入队列channel。basicReject(deliveryTag,false);e。printStackTrace();}}}
  无ack:效率高,存在丢失大量消息的风险;有ack:效率低,不会丢消息。
  作者:阿Q说代码
  链接:https:juejin。cnpost7063259228898590750
搜索 投诉 评论 转载

回顾OPPO手机形态探索进程,从升降屏到卷轴屏,还能怎么玩?未来手机的主流形态几乎是现在所有手机厂商一直在思考的命题,为此手机厂商对手机的形态提出了诸多概念设计,比如目前已经量产的折叠屏。这种设计固然能够展示更多信息流,但也有存在着技术……红米新机使用骁龙695,会是红米10么?感谢您的阅读!1月26日消息,小米举行海外发布会,发布了RedmiNote11Pro和Note11Pro5G手机,分别搭载了联发科HelioG96和高通骁龙695处理器。……小马科技2021年净利9。08万同比下滑88。28新业务及新挖贝网5月8日,小马科技(836827)近日发布2021年度报告,报告期内公司实现营业收入18,448,374。50元,同比增长40。06;归属于挂牌公司股东的净利润90,79……iPhone14ProMax设计图纸曝光药丸圆孔双挖孔,相机北京时间2021年9月15日凌晨1点,苹果在ApplePark发布了iPhone13系列手机。按照惯例,今年9月iPhone14系列也将登场。作为科技界关注的焦点,每次iPho……曾经那些国产手机,你用过哪些?一丶尼彩手机出现在2012年的国产手机品牌一尼彩,拥有三年累积销售额超过60亿,如今却惨淡经营;尼彩坐拥全国线下实体店6000余家,如今却荡然无存;曾经喊出了全世界最嚣张……遇到过刚买的iPhone居然没保修吗?查询居然是资源机人们现在是离不开手机的,手机的品牌有很多,在选择的时候经常犯难,目前市面上iPhone同品牌的手机价格也是不同的,有高有低。根据来源不同又分为正品机和资源机,很多用户分不……雷军再次官宣小米黑科技!320W有线无线的超充组合小米MIX【6月5日讯】导语,虽然在2021年第一季度,全球各大手机厂商的手机销量都实现了大幅度增长,但转眼间来到了4月份、5月份以后,国内手机销量却开始意外大跌,根据统计数据显示,用户……电子音乐监听音箱推荐krkG4还是Jbl305p或306p?电子音乐监听音箱推荐KRKG4还是JBL305p或306p?看自己荷包里的银子是否支持买音乐奢侈品。品牌决定品质,钱决定买品牌,毕竟一分钱一分货。虽然都是美国货,当然是美……RabbitMQ的消息确认机制(含代码实现)哈喽大家好,我是阿Q!上文,我们已经完成了SpringBoot快速集成RabbitMQ的小Demo,本文我们来聊一下RabbitMQ为了防止消息丢失,增加的消息确认机制:……一部手机坚持用了5年还不肯换,这些人是怎么想的?请对号入座大家应该都知道,现在数码手机的发展速度非常快,几乎隔2个月就有新手机发布,而且配置也都有一定程度的升级,另外有些手机发布时,还会首发一些黑科技,让手机更有竞争力。面对各种……阿里员工遭遇性侵事件是员工蝼蚁化的必然结果阿里这两年过得不算太好。想做的社交一直没有起色,用上超750信用分就可以定向约女孩的擦边球手段后略有改善,不过很快就被批判下架了。接着就是传统护城河领域的淘宝和天猫被拼多……探探和红豆瓣,陌陌之类陌生人社交软件的区别除了微信之外,现在的社交都是基于陌生人的社交,而陌生人之间的社交特点是交往时间特别短。然后每个陌生人的社交平台都是垂直分类,都有不一样的特点不一样的玩法和服务功能。先说陌……
2007年,史蒂夫乔布斯(SteveJobs)最伟大的产品面等一台LCD旗舰北京骑手到底能不能月入过万从4198跌至2998元,120W快充OIS防抖,骁龙888Callable和Future支付宝,不知道该说你啥好声震天下,势吞金乌DC评兴戈APT7为什么低代码和身份验证必须共存苹果手机为什么在中国市场价格会卖的这么高,当地却较低?酒桌上的阿里巴巴维度新发手机性价比之王大厂进军元宇宙,藏家老哥们跟不跟?
宝宝多大适合添加辅食?一定是6月龄以后吗?吃什么海鲜最补肾十种海鲜最有效产前用品准备误区旅游系列青海湖到西藏狗狗为什么会舔自己的屁股?如何减少狗狗舔屁股的次数描写雪的优美段落摘抄入选最美中国符号的篁岭晒秋,不容错过的秋季美景无论咸甜,不如相见,端午节快乐呢子大衣配平底鞋时尚个性休闲又帅气游昭报告称英特尔第二季度CPU短缺AMD将抢占笔记本市场市场监管总局不得利用互联网发布处方药烟草广告

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁