范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  哈喽大家好,我是阿Q!
  上文,我们已经完成了SpringBoot快速集成RabbitMQ的小Demo,本文我们来聊一下RabbitMQ为了防止消息丢失,增加的消息确认机制:生产者消息确认机制和消费者消息确认机制。确认机制
  一、生产者消息确认机制在yml中增加配置信息spring:   rabbitmq:     #确认消息已发送到交换机(Exchange)     publisher-confirm-type: correlated     #确认消息已发送到队列(Queue)     publisher-returns: true
  spring.rabbitmq.publisher-confirm 新版本已被弃用,现在使用 spring.rabbitmq.publisher-confirm-type = correlated 实现相同效果增加回调@Bean public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory){  RabbitTemplate rabbitTemplate = new RabbitTemplate();  rabbitTemplate.setConnectionFactory(connectionFactory);  //设置开启 Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数  rabbitTemplate.setMandatory(true);   rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {   @Override   public void confirm(CorrelationData correlationData, boolean ack, String cause) {    System.out.println("ConfirmCallback:     "+"相关数据:"+correlationData);    System.out.println("ConfirmCallback:     "+"确认情况:"+ack);    System.out.println("ConfirmCallback:     "+"原因:"+cause);   }  });   rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback(){   @Override   public void returnedMessage(ReturnedMessage returned) {    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());   }  });  return rabbitTemplate; }confirm机制是只保证消息到达exchange,并不保证消息可以路由到正确的queue当前的exchange不存在或者指定的路由key路由不到才会触发return机制
  大家可以自行演示以下情况的执行结果:不存在交换机和队列存在交换机,不存在队列消息推送成功
  二、消费者消息的确认机制
  默认情况下如果一个消息被消费者正确接收则会从队列中移除。如果一个队列没被任何消费者订阅,那么这个队列中的消息会被缓存,当有消费者订阅时则会立即发送,进而从队列中移除。
  消费者消息的确认机制可以分为以下3种:自动确认
  AcknowledgeMode.NONE 默认为自动确认,不管消费者是否成功处理了消息,消息都会从队列中被移除。根据情况确认
  AcknowledgeMode.AUTO 根据方法的执行情况来决定是否确认还是拒绝(是否重新入队列)如果消息成功被消费(成功的意思是在消费的过程中没有抛出异常),则自动确认当抛出AmqpRejectAndDontRequeueException 异常的时候,则消息会被拒绝,且消息不会重回队列当抛出 ImmediateAcknowledgeAmqpException 异常,则消费者会被确认其他的异常,则消息会被拒绝,并且该消息会重回队列,如果此时只有一个消费者监听该队列,则有发生死循环的风险,多消费端也会造成资源的极大浪费,这个在开发过程中一定要避免的。可以通过 setDefaultRequeueRejected(默认是true)去设置
  可能造成消息丢失,一般是需要我们在try-catch捕捉异常后,打印日志用于追踪数据,这样找出对应数据再做后续处理。手动确认
  AcknowledgeMode.MANUAL对于手动确认,也是我们工作中最常用到的,它的用法如下:/*  * 肯定确认  * deliveryTag:消息队列数据的唯一id  * multiple:是否批量   * true :一次性确认所有小于等于deliveryTag的消息  * false:对当前消息进行确认;  */ channel.basicAck(long deliveryTag, boolean multiple); /*  * 否定确认  * multiple:是否批量   *   true:一次性拒绝所有小于deliveryTag的消息  *   false:对当前消息进行确认;  * requeue:被拒绝的是否重新入列,  *   true:就是将数据重新丢回队列里,那么下次还会消费这消息;  *   false:就是拒绝处理该消息,服务器把该消息丢掉即可。   */ channel.basicNack(long deliveryTag, boolean multiple, boolean requeue);/*  * 用于否定确认,但与basicNack相比有一个限制,一次只能拒绝单条消息  */ channel.basicReject(long deliveryTag, boolean requeue);  手动确认
  在yml配置中开启手动确认模式spring:   rabbitmq:     listener:       simple:         acknowledge-mode: manual
  或者在代码中开启@Configuration public class MessageListenerConfig {      @Autowired     private CachingConnectionFactory connectionFactory;      @Autowired     private MQReciever mqReciever;//消息接收处理类      @Bean     public SimpleMessageListenerContainer simpleMessageListenerContainer(){         SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);         //并发使用者的数量         container.setConcurrentConsumers(1);         //消费者人数上限         container.setMaxConcurrentConsumers(1);         container.setAcknowledgeMode(AcknowledgeMode.MANUAL); // RabbitMQ默认是自动确认,这里改为手动确认消息         //设置一个队列,此处支持设置多个         container.setQueueNames("directQueue");         container.setMessageListener(mqReciever);         return container;     } }
  消息消费类@Component @RabbitListener(queues = "directQueue")//监听队列名称 public class MQReciever implements ChannelAwareMessageListener {      @Override     public void onMessage(Message message, Channel channel) throws Exception {         long deliveryTag = message.getMessageProperties().getDeliveryTag();         try {             String msg = message.toString();             String[] msgArray = msg.split(""");//可以点进Message里面看源码,单引号直接的数据就是我们的map消息数据             System.out.println("消费的消息内容:"+msgArray[1]);             System.out.println("消费的主题消息来自:"+message.getMessageProperties().getConsumerQueue());                          //业务处理             ......                          channel.basicAck(deliveryTag, true);                      } catch (Exception e) {             //拒绝重新入队列             channel.basicReject(deliveryTag, false);                e.printStackTrace();         }     } }
  无ack:效率高,存在丢失大量消息的风险;有ack:效率低,不会丢消息。
  作者:阿Q说代码
  链接:https://juejin.cn/post/7063259228898590750

进军集成灶领域,老板电器拉开行业洗牌大幕目前,国内家电市场已趋于饱和,再叠加原材料上涨疫情反复等因素,家电行业压力骤增。面对如此情形,企业只有拓宽眼界寻求新兴发展之路,才能进一步赢得市场先机。老板电器专注不断的自我进化自云康宝CS10A八电极体脂秤,了解身体状况需要它随着生活水平日渐提高,人们对健康的重视程度逐渐加深,过去人们只知道关注体重,随着健身理念的普及,现在人们了解身体的体重体脂率等体征取代了关注体重,成为了更加科学的健康指标。这样体脂跌破5300元!苹果A15全网通5G,谁曾料到,降价如此之快最近小芳在整理主市面上主流机型的售价情况的过程当中异常发现,iPhone13这款手机的价格出现了异动,在京东上绿色版本的iPhone13的售价已经来到了5249元,而白色版本或者是给摩托罗拉手机外观优化的建议如今的摩托罗拉手机已取代小米手机的信价比之王的称号,凭借价格上的优势让消费者得到了实惠。希望摩托罗拉能够继续推出高信价比产品。为了让摩托罗拉能够生产出更优秀的手机,今天小编给摩托罗创新可分离设计,飞宇pocket2S口袋相机有哪些独到之处?随后记录现在几乎成为我生活的一部分了,我习惯通过图像的方式去记录生活,尤其是当前短视频当道的情况下,视频记录更成为了我习惯的一部分。我目前习惯的记录方式是手机和微单,微单能够提供最魅族19sPro敲定天玑9000芯片,161TB大存储,黄章信心十足最近各大品牌都纷纷发布了新的旗舰系列,就连和魅族同为老品牌的中兴,今年也是火力全开,只有魅族还在按兵不动。虽然说还不知道具体的发机日期,但是可以确定的是魅族今年也有联发科的天玑处理华为哈勃投资,激光芯片第一股长光华芯登上科创板文福布斯中国4月1日,长光华芯在上海证券交易所科创板上市,公司证券代码688048。SH,发行价格80。8元股。该公司拟首次公开发行3,390万股,占发行后股份总数的25。招股书显小米上线49元换电池米粉节活动,每天十点开启4月1日消息,小米在今日开启了米粉节活动,并且在4月1日到4月10日期间的每天10点开启49元换电池活动的抢购,每一场的持续时间为20分钟。值得注意的是,这一次的小米米粉节49元换为什么雨水闻起来很好闻?最近北京下了一场小雨,空气变得格外清新,雨水的气味让人很舒心,你喜欢雨水的气味吗?其实,有的人喜欢雨水的气味,并不只是心理感受,这后面还真的有科学道理。为什么雨水闻起来很好闻?科学比亚迪海豹特斯拉Model3你准备接招吧要说国内汽车发展情况,新能源车绝对在全球范围内无可匹敌,除了大量造车新势力带来的天马行空的设计外,传统燃油车企也不甘示弱纷纷发布自家新能源汽车。有着制造电池背景的比亚迪更不甘示弱,兼客周报工信部重拳推进打猫断卡,京东裁员仍在继续国家知识产权局我国知识产权人才规模达69万人国家知识产权局人事司一级巡视员丰兆龙在国家知识产权局3月例行新闻发布会上介绍,我国知识产权人才规模达到69万人,国家经济职称系列增设知识
以浪漫之名谈谈圣托里尼装修风格的WiFi覆盖有人说,爱她就一定要带她去圣托里尼位于希腊的旅游圣地月牙形环岛山崖上的蓝白色小屋和蔚蓝的爱琴海遥相辉映圣托里尼不只是诗和远方这里是失落的亚特兰蒂斯有古希腊神话的浪漫唯美傍晚更能看到当MSI冠军属于RNG樱木花道和流川枫从未配合过一次。直到他们看到自己有希望赢山王重工的一瞬间,两个人放下了隔阂,随后樱木就对山王工业打出了绝杀。希望是最好的东西。说起来,你们可能都不信。上一次,各大赛捷豹XFL只聊三大件,技术实力到底如何?捷豹汽车,在国内征战时间不算短了,作为豪华品牌,销量上却一直起不来。家族中大型轿车捷豹XFL很多人并不陌生,目前在终端市场有不错的优惠,外观颜值很多人都有所了解,今天主要从技术的角法拉利296GTB采用插电式混动方案,性能表现如何?说到性能跑车,我们会想到法拉利,在今年10月份,家族推出了一款新的GT跑车,名字叫做法拉利296GTB。从售价上来看,新款车型指导价在298。8万,搭配3。0T双涡轮发动机,并且是微信8。0。14内测更新老年模式上线时隔多日,微信终于迎来新一轮内测更新。昨天,微信发布了安卓8。0。14内测版本,本次内测又带来了哪些新功能呢?早前,微信被工信部要求进行适老化改造。在本次内测版本中,微信为此推出了Linux实战020Ubuntu截图工具及快捷键设置在写文章的时候为了更好地阐述内容我们通常需要附上图片,图片可以更加简单直观的作者想要传递的内容。截图也是获取图片的一种方式,我们可以在系统中获取桌面上显示的全屏所有当前窗口和任意区Linux实战019解决Ubuntu更新NOPUBKEYNOPUBKEY在虚拟机体验了几天Ubuntu感觉还不错,今天直接在笔记本上安装上了。由于Ubuntu官方的软件源着实是太慢了,所以我第一件事情就是将软件源换成国内的镜像源(具体操Linux实战023Ubuntu解决Wine乱码问题刚装上了Wine6。0稳定版,终于可以在Ubuntu上面运行Windows软件了(O()O)。但是遇到的第一个问题就是通过Wine打开的Windows软件中文都乱码了,这样啥也看不Linux实战024快速为Firefox添加百度搜索引擎搜索功能是我们日常用的比较多的功能,ubuntu为用户默认安装了Firefox浏览器。该浏览器默认的搜索引擎是Google,如果你在地址栏输入的不是地址而是内容那么浏览器就会自动启盲盒之外的泡泡玛特8月27日,泡泡玛特发布2021年半年报,财报显示,泡泡玛特收入达到17。73亿元,同比增长116。8,经调整后净利润达到人民币4。35亿元,同比增长144。1,增速明显高于营收。泛生子Q2财报创历史新高,肿瘤精准医疗企业如何脱颖而出发展多年的基因检测,依旧是资本眼中的宠儿。根据动脉网数据,上半年国内基因检测领域一级市场融资额超70亿元。这其中,超过半数融资额由肿瘤精准医疗行业公司完成。不得不说,肿瘤精准医疗赛