本文目录一览:
公文中经常使用很多连词,比如:和、与、或、跟、同、及、以及、及其、暨等,这些连词意思相近,有的可以互换使用;但有的用法上有微妙区别,让人有时不好把握。今天老王就以“和”为参照,来辨析一下这些连词之间的区别。
一、关于“和”。“和”的本义是和谐的意思,读作hé,引申到平和、温和、柔和的意思。“和”是一个多音多义词,其用法和读音有很多,比如:“和”字作为动词,读作huó时,是在粉状物中加液体搅拌的意思;读作huò时,指搅拌、加水搅合的意思,等等。这里重点辨析“和”作为连词时,表示连带、共同一起的意思。
二、“和”跟“与”的区别。“和”跟“与”都表示“平等的联合关系”,但“和”用得更多、更广,“和”可以连接名词,例如“工人和农民”;可以连接动词,例如“传播和接受”;可以连接形容词,例如“聪明和美丽”;还可以连接代词,例如“我和他”。“与”通常只连接名词,例如“小学、中学与大学”。“和”有时还可表示选择,相当于“或”,“与”则没有这样的意思。例如:“去和不去,你自己选择”,这里“和”不能换成“与”。在有几个层次的多项并列成分中,“和”一般用于第一个层次,“与”、“同”、顿号等则表示另一个层次。
三、“和”与“或”的区别。“和”表示并列关系,例如“我要去北京和上海”;“或”表示选择关系,例如“我要去北京或上海”,两者的意思还是比较好区别的。“和”有时也表示选择关系,如前面提到的“去和不去,你自己选择”,但这种情况用得较少。
四、“和”与“跟”的区别。“跟”的本义指脚的后部,即脚后跟。用作连词时与“和”语义相近,可以互换,例如:“我和同学在一起”,“我跟同学在一起”。但“跟”在一定意义上有随着后面的意思,例如:“我跟领导出差”,这里有一个弱层级关系。“跟”多用于口语,“和”在口语和书面语中都用。
五、“和”与“同”的区别。“同”多用于书面语,与“和”表示联合关系有所不同,“同”更多地表示偏正关系,例如:“我和你”,含意是“有你也有我”;“我同你”,含意是“以你为主,我随同”。
六、“和”与“及”、“以及”、“及其”的区别。1.“及”、“以及”也表示并列关系,有划分层次的作用,与“和”不同的是,“及”、“以及”连接的成分有主次先后之分,大多为前主后次。例如:“书本、文具以及其他学习辅助用品要事先准备好”(主次之分),“婴儿、儿童及少年”(先后之分)。2.连接不同类的事物则可不分主次。例如:“钢铁、煤炭的生产,以及营销都要有计划”。3.“及”、“以及”连接的通常是名词,连接三项以上的成分时,“及”通常放在最后一项的前面;“以及”还可连接短句,前面用逗号停顿。例如:“怎样生产,怎样营销,以及怎样做好售后服务应该事先进行周密筹划”。4.“及其”连接的后面和前面是相互关联的,大多有包含关系。例如:“电气工程及其自动化”,“自动化”是附属于“电气工程”的;“电气化工程与自动化”,“自动化”则是表示与“电气化工程”不相关或关联度不大的自动化。
七、关于“暨”。“暨”读作jì ,表示“和”、“及”的意思。“暨”具有浓厚的书面语色彩和庄重典雅的意味,常用于郑重的语用场合,例如会标、请柬、贺函等,运用范围较窄。“暨”与“及”尽管意思相同,但一般不能互换。
现在似乎全中国的互联网公司都在做金融。我看不明白。
——周鸿祎
文 / 巴九灵
01.一把水果刀背后的金融梦
1月25日的上午,360成都分公司被一个陌生男人打破了平静。
深陷360借条平台借款纠纷的男人,手持一把水果刀,闯入360办公区。他和一名员工交涉无果后,举起刀子,刺伤了对方的手掌和膝盖。
图源:
伤人者被警方带走,但背后的借贷纠纷也让人好奇,360借条是拉了多大的仇恨?
360借条是360数科旗下个人及小微信贷平台,是近几年最饱受争议的借款平台之一。
在黑猫投诉上,有超过22000条投诉指向360借条。
投诉的主要问题,是*催收和费率畸高。360借条动辄打爆逾期者和其亲友的通讯录,不仅如此,即便借款人提前还款,也需要支付高昂的利息。
小巴在投诉信息里看到,一名用户借款7300元,使用一个月零六天,提前还款,仍需归还8645.36元,和广告上宣称的年化综合息费率7.2%起,相去甚远。
图源:360借条的网页广告
然而,如今360对互联网金融的执着和当年周鸿祎的抵触简直大相径庭。
早在9年前,有人问周鸿祎360要不要搞金融时,他异常激动地反问:
“为什么全中国的互联网公司,现在都奔着金融去呢?为什么不能各自干点有意思的事情?”
当时,互联网巨头都一猛子扎进了金融领域。
2013年,支付宝携手天弘基金,推出了余额宝。
支付宝背靠阿里,有电商平台和信用体系的优势。
2014年,微信的理财通首批接入华夏基金、汇添富基金、易方达基金、广发基金四家基金,宣布正式打造金融开放平台。微信的社交属性保证了稳定的流量,碎片化时间理财更容易让用户接受,这些特质都给金融平台铺了路。
彼时360重心还在安全产品和浏览器上,安全产品手机用户有6.73亿人,360安全浏览器的月活人数是3.57亿人。尽管360产品的渗透率高达94%,但如何吸引用户、评估用户,都还是抽象的想象。
周鸿祎在那段时间拒绝了找上门来的基金公司和银行。
直到一个和360极为相似的影子对手出现,才让他看到了互联网金融与360结合的可行性。
这个影子对手就是和360一起在流氓道路上互殴的2345。
02.难缠的蓝色章鱼
在你安装其他软件“下一步”不小心点快的时候,这两个软件的“全家桶”就会出现在你的电脑上。一个是360的绿图标,一个是打开网页后的蓝章鱼,甩都甩不掉。甚至有人问,2345是不是360旗下的导航?
图源:2345导航截图
它们不仅没有从属关系,而且毫不相关。
2005年,2345网站导航上线,一边通过给网友提供盗版Windows系统,暗中植入导航,一边请超过800万的技术员进行推广,在电脑里预装2345的软件。蓝章鱼的触角不断伸长,迅速成为国内第二大导航。
2006年8月,周鸿祎投资奇虎360科技有限公司,360安全卫士随之面世。
最初十年,双方各显神通,较劲但不打仗。
2345经常篡改安装了360安全卫士电脑的主页,360严防死守的同时,号召网友自发网民公投“恶意软件”。当时是魔高一尺道高一丈,二者互相屏蔽,互相找漏洞,斗智斗勇。
2011年到2014年的三年,2345的网页导航的用户从50万增长到1000万,360安全卫士拥有超过6亿用户。或许是树大招风,2345也眼馋了360的产品。
2345相继推出了2345安全卫士、2345浏览器、2345游戏盒子等等。
这些产品就是360安全卫士、360浏览器、360游戏盒子的纳米级复刻产品。
之后的几年,双方因为侵权问题官司不休,但一个更直观的事实是,二者的业务和收入构成也逐渐趋同了。
转机还要从2345的主动离场说起。表面上看起来它还在和360在产品上缠斗,2018年360才胜了第一场官司。
实际上在2016年,互联网金融就成了2345利润的主要来源。
对于360来说,2345很难缠,但也并非没有一点好处。暗戳戳改道的2345,替360提前蹚了互联网金融的水。
03.相继走上互金路
2014年,2345设立了一家金融科技公司,推出了“随心贷”。
2015年,360金服成立,2016年,360借条上线。
2016年和2017年两年,2345金融借款平台背靠上海银行,一共发放了360亿的贷款,两年的营业收入为22亿元。2017年的金融借款净利同比增长了4469.09%,2345将互联网金融转为主业。搜索引擎+银行的模式走通了。
2345被银行看重的优势是大数据和营销能力,比如“全家桶”能带来360度环绕的弹窗广告,能监测用户的各种行为,这个能力360也有。
尽管没有明确的证据指向360尾随着2345做互联网金融,但是时间点上,360却显示出了亦步亦趋的态势。2345做什么成了,360接下来就甩开膀子开干。
在2345推出随心贷的一年多时间后,周鸿祎跟银行开始了合作,这件事被发现还是在去年5月。
新闻报道一名女士的征信报告中,工作单位一栏中出现“专业做鸡十年”的侮辱性句子。
这家公司叫晋商消费金融股份有限公司,在2016年成立,持股25%的第二大股东是北京奇飞翔艺商务咨询有限公司,法人和董事长都是周鸿祎。
2345的收益证明了互联网金融的可行性,在这几年,360也下了大力气。
在2018年,360金融新增了920万授信用户,净利润同比增加464%。
2345的“引路”在2019年结束了,金融相关的业务关了,债务打包送人了,和互金几乎脱离了关系。
2019年,是互联网金融的严打之年,《关于办理非法放贷刑事责任案件若干问题的意见》下发,贷款产品年利率不得超过36%成为了一道红线。但国家对互联网金融的管控,并不是从2019年才开始的。
2016年,银监会等四部委就发布了关于网络借贷的管理暂行办法,规定了同一借款人在同一平台上的借款上限,在这场风波中,房产贷款和汽车贷款的网贷平台受到了冲击。360此时to C的借款业务才刚刚开始,躲过了一次监管。
2018年,因为P2P的频繁暴雷,互联网企业去金融化浪潮袭来,政府工作报告里出现了21次金融,与之相伴的动词是监管、改革。
互联网金融在监管之下朝着科技企业方向转型,蚂蚁金服变成蚂蚁科技集团,京东金融变成京东数科。
这一年,还叫360金融的360数科发展科技的重点放在了提高获客*度、控制风险逾期率等等,因为风险监管得当,360在这一年获得了20家传统金融机构的信赖。
次次都在监管风暴中脱身的360,变得更加“自信”,这种自信体现在更激进的经营动作上。
2020年6月,360认购了天津金城银行股份有限公司30%的股份,成为银行的第一大股东。在360的流血事件刚发生的这几天,360数科也没受到影响,宣布将继续整合小微相关产品,包括商户贷、发票贷等等业务。但这期间,一个事实上更致命的风险点,却似乎被它刻意忽略——借款人的合法利益保障。
它或许还能在国家对互联网金融的监管之下游刃有余地经营,或许还能受到更多传统金融机构的青睐,但这次流血事件也揭露了另一个真相,如果360借条不能在兼顾借款人利益的情况下转型,那这把水果刀,迟早还要架在脖子上。
① 《2021年中国游戏产业报告》显示,2021年中国移动游戏市场实际销售收入为2255.38亿元,用户规模为6.56亿人,根据这组数据估算,2021年移动游戏用户人均氪金344元。(i黑马)
② 民政部在2022年第一季度的新闻发布会上,公布了低收入人口数据库已建成的消息。目前,全国共认定低保边缘人口431万人、支出型困难人口433万人,连同低保对象、特困人员等低收入人口,形成了包含5800多万人口的低收入人口数据库。数据库能帮助相关部门的工作人员发现需要救助的困难群众,对他们及时进行救助帮扶。(***)
2021年爆款名字:《2021年全国姓名报告》发布,在2021年出生并进行户籍登记的新生儿中,男性新生儿使用频率*的名字是沐宸,女性新生儿使用频率*的名字是若汐。能看出来,十几年前热衷于玛丽苏小说的人当爸妈了。
疫情下的杭州,没有抱怨,没有担忧,居民们反而纷纷晒起了免费隔离物资:羊排、酱鸭、牛奶……社区之间的免费隔离物资已经卷起来了。调侃归调侃,面对疫情有条不紊的背后是杭州一线的抗疫人员付出,他们才是让我们安心的真英雄。
这个冬天,你滑雪了吗?
从地域分布上看,86%的消费者来自一、二线城市,北上广人群是消费主力军。从总体消费水平来看,在马蜂窝预订的冰雪旅游消费中,约四成游客旅行人均花费在5000元以上,其中20%的人消费在万元以上。这说明,滑雪爱好者,舍得为更⾼品质的滑雪体验买单。那么,火热的冰雪运动背后有何机会?晓报告将从五大冰雪消费特点出发,带你看冰雪带来的机会。
本篇
-吴晓波领讲50本商业图书,一起叩开商业大门-
被人读错名字,伤自尊!
读错别人的名字,很尴尬!
然而,你有没有考虑过?
地名也是有尊严的!
TA们,也不想被读错!
我们为大家精心整理了各省、市、区
最容易读错的100多个地名,
看看你以前读错了多少?
北京市潭柘寺:柘读zhè,寺有一千七百年历史;
爨底下:爨读cuàn,生火做饭之意;
妫水河:妫字音读guī,春秋时有美女息妫;
大栅栏:dà shí lànr,注意儿化音;
演乐胡同:乐在此读yào。
天津市蓟县:蓟读jì,一种草本植物;
双港:港在这里读jiǎng;
宜兴埠:埠字的标准读音bù,但在这里读fǔ。
河北省蔚县:蔚读yù,不读wèi;
井陉:陉读xíng,不读jīng;
蠡县:蠡读lǐ,顺便记一下和西施有关的范蠡;
藁城:藁读gǎo,在诗文中“藁砧”指代丈夫;
涿州:涿读为zhuō;
乐亭:lào ting,亭发轻声。
山西省隰县:隰读xí,《卫风·氓》“隰则有泮”;
洪洞:洞读tóng,例如“苏三离了洪洞县”;
临汾:汾读fén,汾水、汾酒同理;
忻州:忻读xīn。
内蒙古自治区扎赉诺尔:赉读lài,赐予、赏赐的意思;
巴彦淖尔:彦读yàn,淖应读nào,林妹妹《葬花吟》“强于污淖陷渠沟”;
磴口:磴读dèng。
辽宁省阜新:阜读fù,易误读为“bù”以及“fǔ”;
桓仁:桓读huán;
岫岩:岫读xiù,此地产玉,名为岫玉。
吉林省珲春:珲读hún,注意与下文瑷珲的珲区别;
桦甸:桦读huà。
黑龙江省穆棱:棱是多音字,在此读líng,不读léng;
讷河:讷 读nè;
肇州:肇读zhào,起始之意,金代认为这里是“祖宗肇兴”之地;
瑷珲:读作ài huī,历史书上的“瑷珲条约”在此签订,1956年改名为“爱辉”,2015年恢复为瑷珲。
上海市莘庄:莘读xīn,不读shēn;山东莘县的莘,读为shēn,不读xīn;
五厍:厍读shè,注意比车库的“库”少一点;
颛桥:颛读zhuān,想想谐音“砖桥”比较好记;
蕰藻浜:蕰读wēn,浜读bāng。
江苏省盱眙:读xū yí,这里盛产小龙虾;
邗江:邗读hán,京杭运河的一段叫“邗沟”;
邳州:邳读pī;
甪直:甪读lù,注意比“角”少一笔;
栟茶:栟读bēn;
浒墅关:浒读xǔ,不读水浒传的hǔ。
浙江省丽水:丽读lí,《千字文》“金生丽水”;
台州:太读tāi,天台山的台同理;
嵊州:嵊读shèng;
鄞县:鄞读yín;
诸暨:暨读jì,西施故里。
安徽省歙县:歙在这里读shè,多音字,还读xī;
六安:六读lù,有一种茶叫“六安瓜片”;
亳州:亳读bó,注意比“毫毛”的“毫”少一笔;
枞阳:枞读zōng,多音字,还读cōng;
黟县:黟,读yī;
濉溪:濉,读suī;
蚌埠: 读音为bèng bù;
砀山:砀读dàng。
福建省长汀:汀读tīnɡ,例如“汀上白沙看不见”;
琯江:琯读guǎn;
东庠:庠读xiáng,注意偏旁,当地人读xiǎng;
曾厝垵:读音为zēng cuò ān,垵字正规应读三声,但是当地人一般读一声;
筼筜湖:筼筜 yún dāng,是一种竹子,韩愈有诗“筼筜竞长纤纤笋,踯躅闲开艳艳花”。
江西省铅山:铅读yán,不读qiān,地名专用字音;
钤山:钤读qián;
婺源:婺读wù,旅游胜地读错了买不到票哦;
弋阳:弋读yì;
长堎:堎读lèng,此镇与滕王阁隔江相望。
山东省莒县:莒读jǔ,不读lǔ;
茌平:茌读chí;
临朐:朐读qú;
郯城:郯读tán;
单县:单读shàn;
曲阜:正确的读音qū fù,孔子故乡;
鄄城:鄄读juān,不读yān;
芝罘:罘读fú,是一种打猎用具,秦始皇曾经在这里立石颂德。
河南省
浚县:浚读xùn,多音字,还读jùn;
武陟:陟读zhì;
泌阳:泌读bì,不读mì;
渑池:渑读miǎn;山东渑水的渑读shéng;
荥阳:荥读xíng,而四川荥经的荥读音yíng;
中牟:牟,读为mù,不读móu。
湖北省黄陂:陂读pí,多音字,还读bēi以及bō;
郧县:郧读yún;
秭归:秭读zǐ,屈原故里;
监利:监,读jiàn,不读jiān;
猇亭:猇读xiāo;
蕲春:蕲读qí,李时珍故乡。
湖南省耒阳:耒读lěi;
郴州:郴读chēn,秦观《踏莎行》“郴江幸自绕郴山,为谁流下潇湘去”;
筻口:筻读gàng;
枨冲:枨读chéng。
广东省东莞:莞读guǎn;
番禺:番读pān;
沥滘:滘读jiào;
巽寮湾:巽读xùn,八卦之一;
硇洲岛:硇读náo,有种矿物叫“硇砂”。
广西壮族自治区吴圩:圩读xū ,也许你去过南宁吴圩机场;
百色:百按古音读bó。
海南省儋州:儋读dān,苏轼曾经的贬谪地,《自题金山画像》“问汝平生功业,黄州惠州儋州”。
重庆市涪陵:涪读fú,涪陵榨菜的故乡;
綦江:綦读qí,青黑色的意思,《郑风·出其东门》“缟衣綦巾”;
北碚:碚读bèi。
四川省郫县:郫读pí,郫县豆瓣是川菜的灵魂之一;
珙县:珙读gǒng;
犍为:犍读qián,犍牛的犍读jiān;
邛崃:qióng lái,卓文君的故乡;
筠连:筠读jūn,不读yún;
阆中:阆,读làng。
贵州省永燊:燊读shēn;
岜沙:岜读biā,普通话里没有这个读音,但就像biangbiang面一样,入乡随俗(字典读bā);
大磏:磏读qiān;
浞水:浞读zhuó。
云南省勐海:勐读měng,傣族语音译字;
禄脿:脿读piǎo;
漾濞:濞读bì,此地盛产核桃;
者竜:竜读lóng。
西藏自治区那曲:正确读法是nā qū;
噶尔:噶读gá。
陕西省洽川:洽读hé;
栎阳:栎读yuè,不读lè;
柞水:柞读zhà;
吴堡:堡,读bǔ;
虢镇:虢读guó,历史地名专用,杨贵妃有个姐姐被封为“虢国夫人”。
甘肃省崆峒:正确读法是kōng tóng,喜欢看武侠小说的话应该不会读错;
颉崖:颉读xié;
垲坪:垲读kǎi;
枹罕:枹读fú,鼓槌的意思;
吴砦:砦读zhài,王维诗《鹿砦》。
青海省茶卡盐湖:卡读qiǎ,这里被称为“天空之镜”;
窎沟:窎读diào。
宁夏回族自治区潘昶:昶读chǎng。
新疆维吾尔自治区巴音郭楞:楞读léng,不读lèng;
焉耆:耆读qí。
香港特别行政区寨乪村:乪读náng;
坪輋:輋读shē;
红磡:磡读kàn, 红磡体育馆简称红馆;
作壆坑:壆读bó。
***特别行政区凼仔岛:凼读dàng,当地一般写作异体字“氹”。
怎么样?你读对了多少呢?
诗词世界
【声明:本号为“全民阅读推广”官方公益账号,转载此文是出于传递更多信息之目的。若有来源标注错误或涉嫌侵犯您的合法权益,请联系我们。我们将及时更正、删除,谢谢。】
前言
上一章讲解了RabbitMq的三种Exchange消息发送的模式,但是在默认情况下RabbitMQ并不能保证消息是否发送成功,以及是否能被成功消费,为了保证消息在传递过程中不丢失,需要对消息进行确认机制,来提高消息的可靠性。
消息确认
基本流程
说明:
生产者发送消息到RabbitMQ Server后,RabbitMQ Server需要对生产者进行消息Confirm确认。消费者消费消息后需要对 RabbitMQ Server进行消息ACK确认。消息确认模式
RabbitMq提供了两种消息发送者确认模式分别为: ConfirmCallback确认模式和 ReturnCallback退回模式。
ConfirmCallback确认模式
@Componentpublic class RabbitConfirmConfig implements ConfirmCallback{ private Logger logger = LoggerFactory.getLogger(RabbitConfirmConfig.class); public void confirm(CorrelationData correlationData, boolean ack, String cause) { logger.info("数据内容:{}",correlationData); logger.info("是否确认成功:{}",ack); logger.info("错误原因:{}",cause); if (!ack) { logger.info("exchange produce confirm message send error" + cause); } else { logger.info("exchange produce confirm message send success"); } }}复制代码
说明:ConfirmCallback模式确认,需要重写confirm接方法,此方法的三个参数分别为:CorrelationData、ack、cause
CorrelationData:对象内部只有一个id属性,用来表示当前消息的*性。ack:消息投递状态,true表示投递成功cause: 消息投递失败原因虽然消息被broker接收到只能表示已经到达MQ服务器,但是并不能保证消息一定会被投递到目标 queue里。所以我们需要实现returnCallback来进行相关处理。
ReturnCallback退回模式
@Componentpublic class RabbitReturnConfig implements ReturnCallback{ private Logger logger = LoggerFactory.getLogger(RabbitReturnConfig.class); public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { logger.info("消息发送送到队列信息:"); logger.info("发生消息:{}",message); logger.info("回应码:{}",replyCode); logger.info("回应信息:{}",replyText); logger.info("交换机:{}",exchange); logger.info("路由键:{}",routingKey); }}复制代码
说明:实现接口ReturnCallback重写returnedMessage()方法,方法有五个参数message(消息体)、replyCode(响应code)、replyText(响应内容)、exchange(交换机)、routingKey(路由键)。
消息发送者确认
@Componentpublic class MqConfirmProduce{ @Autowired private RabbitTemplate rabbitTemplate; @Autowired private RabbitConfirmConfig rabbitConfirmConfig; @Autowired private RabbitReturnConfig rabbitReturnConfig; /** * * @param exchange 消息交互机名称 * @param routeKey 消息路由键的名称 * @param message 消息内容 */ public void sendMessage(String exchange ,String routeKey,Object msg) { //确保消息发送失败后可以重新返回到队列中 rabbitTemplate.setMandatory(true); // 消费者确认收到消息后,手动ack回执回调处理 rabbitTemplate.setConfirmCallback(rabbitConfirmConfig); //消息投递到队列失败回调处理 rabbitTemplate.setReturnCallback(rabbitReturnConfig); //保证消息*性 CorrelationData correlationData =new CorrelationData(UUID.randomUUID().toString()); //发送消息 rabbitTemplate.convertAndSend(exchange,routeKey,msg, message -> { message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); return message; }, correlationData); }}复制代码
说明:注意需要开启消息确认的配置:
rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / #开启发送确认 publisher-confirms: true # 开启发送失败退回 publisher-returns: true listener: simple: # 手动确认 acknowledge-mode: manual retry: enabled: true
消息接收者确认
@Component@RabbitListener(queues = "testQueue")public class MqConfirmConsumer{ private static final Logger logger = LoggerFactory.getLogger(MqConfirmConsumer.class); @RabbitHandler public void receive(String msg, Channel channel, Message message) throws IOException { logger.info("receive message content:{}",message); try { logger.info("开始消息确认"); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); logger.info("消息确认成功"); } catch (Exception e) { logger.error("消息确认失败,即将再次返回队列中"); channel.basicNack(message.getMessageProperties().getDeliveryTag(), true, true); } }}
说明:消息者确认消息有三种模式,分别为basicAck、basicNack、basicReject。
basicAck模式
表示成功确认,使用此回执方法后,消息会被rabbitmq broker删除。
void basicAck(long deliveryTag, boolean multiple) 复制代码
deliveryTag:消息投递序号,multiple:是否批量确认,值为 true则会一次性ack所有小于当前消息deliveryTag的消息。
basicNack模式
表示失败确认,一般在消费消息异常时用到此方法,可以将消息重新投递入队列。
void basicNack(long deliveryTag, boolean multiple, boolean requeue)复制代码
deliveryTag:表示消息投递序号。requeue: 表示消息是否重新入队列,true表示重新投入队列中。multiple:是否批量确认,true表示会一次性ack所有小于当前消息deliveryTag的消息。
basicReject模式
basicReject:拒绝消息,与basicNack区别在于不能进行批量操作,其他用法很相似。
void basicReject(long deliveryTag, boolean requeue)复制代码
deliveryTag:消息投递序号。requeue:值为true表示消息重新入队列
测试
测试发送消息,消息发送者的确认信息
c.s.f.r.config.RabbitConfirmConfig - exchange produce confirm message send successc.s.f.r.config.RabbitConfirmConfig - 数据内容:CorrelationData [id=88ea47a5-726d-44c5-9839-1f2a6bf942ed]c.s.f.r.config.RabbitConfirmConfig - 是否确认成功:truec.s.f.r.config.RabbitConfirmConfig - 错误原因:nullc.s.f.r.config.RabbitConfirmConfig - exchange produce confirm message send success复制代码
消费者的确认信息
receive message content:(Body:'this is test message' MessageProperties [headers={spring_listener_return_correlation=0fcefb6d-acea-4eb2-8484-e3a82f8c584f, spring_returned_message_correlation=88ea47a5-726d-44c5-9839-1f2a6bf942ed}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=testDirect, receivedRoutingKey=testDirectRouting, deliveryTag=2, consumerTag=amq.ctag-dOwkSPuI1e0HR_1Ufu3Erw, consumerQueue=testQueue]) c.s.f.r.consumer.MqConfirmConsumer - 开始消息确认c.s.f.r.consumer.MqConfirmConsumer - 消息确认成功复制代码
消费者确认失败
如果消息确认在消费者确认失败,那么消息将会重写投递导导消息队列的首部。模拟消费者确认失败场景:
@Component@RabbitListener(queues = "testQueue")public class MqConfirmConsumer{ private static final Logger logger = LoggerFactory.getLogger(MqConfirmConsumer.class); @RabbitHandler public void receive(String msg, Channel channel, Message message) throws IOException { logger.info("receive message content:{}",message); try { logger.info("开始消息确认"); int c=1/0; channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); logger.info("消息确认成功"); } catch (Exception e) { logger.error("消息确认失败,即将再次返回队列中"); channel.basicNack(message.getMessageProperties().getDeliveryTag(), true, true); } }}复制代码
查看执行结果:
c.s.f.r.consumer.MqConfirmConsumer - receive message content:(Body:'this is test message' MessageProperties [headers={spring_listener_return_correlation=0fcefb6d-acea-4eb2-8484-e3a82f8c584f, spring_returned_message_correlation=39d4cdd1-cbeb-4090-91ea-9e5d0bed785c}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=testDirect, receivedRoutingKey=testDirectRouting, deliveryTag=1, consumerTag=amq.ctag-e5GtG455pkm7eWfY3xGleg, consumerQueue=testQueue])c.s.f.r.consumer.MqConfirmConsumer - 开始消息确认c.s.f.r.consumer.MqConfirmConsumer - 消息确认失败,即将再次返回队列中复制代码
消息已经重新返回队列中。我们查看队列信息具体
说明:我们可以看到消息为Unacked状态,消息又会重新会被消费,然后确认失败,又重新被消费,导致死循环。
解决办法
针对这种情况,我们将如何处理呢?我们手动确认失败后,并将消息持久入到MySQL中通过定时任务做补偿。然后删除消息队列。具体修改
@RabbitHandler public void receive(String msg, Channel channel, Message message) throws IOException { logger.info("receive message content:{}",message); try { logger.info("开始消息确认"); int c=1/0; channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); logger.info("消息确认成功"); } catch (Exception e) { if (message.getMessageProperties().getRedelivered()) { logger.error("消息确认失败,拒绝处理"); //执行持久化处理 channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); } else { logger.error("消息确认失败,即将再次返回队列中"); channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); } } }复制代码
修改后执行结果
总结
本文讲解了RabbitMQ消息确认机制,消息是否需要确认,我们需要根据业务的场景来分析,如有疑问,请随时反馈。
今天的内容先分享到这里了,读完本文《暨是什么意思》之后,是否是您想找的答案呢?想要了解更多暨是什么意思、360借条二次评估未通过相关的体育资讯请继续关注本站,是给小编*的鼓励。
女排世锦赛比赛时间表2022年女排世锦赛比赛时间表:9月28...
今天阿莫来给大家分享一些关于竞走*王丽萍教跑步王丽萍教练组处理结果...
今天阿莫来给大家分享一些关于18年辽宁男篮夺冠新闻发布会81岁蒋兴权...
战天狼都谁牺牲了《战天狼》牺牲的角色如下:温涛、张新奎:...
亚运会历届奖牌榜第7届1974年德黑兰亚运会中国仅次于日本...