3.3.5 请求测试3.3.5.1 场景1:使用唯一路由键发送消息路由键名: rabbitmq_topic_routing_key_kh96.only
发起请求:
文章插图
请求结果:队列One,Two,Three都接收到了信息,所以对应的消费者One,Two,Three都消费了信息;
文章插图
3.3.5.2 场景2:使用单词匹配路由键
发送消息路由键名: rabbitmq_topic_routing_key_kh96.abc
发起请求:文章插图
请求结果:队列Two,Three都接收到了信息 , 所以对应的消费者Two,Three都消费了信息;
文章插图
3.3.5.3 场景3:0 或多词匹配
发送消息路由键名: rabbitmq_topic_routing_key_kh96.abc.def
发起请求:文章插图
请求结果:只有队列Three接收到了信息,所以只有对应的消费者Three消费了信息;
文章插图
3.3.6 主题模式小结
- 当生产者发送消息到交换机,指定的路由键一般都是使用句点(.)作为分隔符,分割多个单词 。
- 比如:词1.词...
- 所谓单词:是由一个或多个单词组成,多个单词组成的路由键,就代表某种主题的关键信息,路由键长度最多不能超过256字节 。
- 匹配规则格式:* 或者 #
- *代表单个单词 。
- 比如 队列绑定主题交换机的 路由键:KH96.* ,代表发送消息的路由键是以KH96开头,后面只能跟一个单词,如:KH96.aaa,KH96.bbb等 。
- 再比如:绑定路由键为:KH96.*.KGC,代表发送消息路由键是以KH96开头 , 中间可以带一个单词,结尾,如:KH96.aa.KGC,KH96.bb.KGC 。
- #代表0或多个单词,比如 队列绑定主题交换机的 路由键:KH96.#,代表发送消息的路由键是以KH96开头,后面只能跟0个或者多个单词,如:KH96,KH96.aaa , KH96.aaa.bbb 。
- 再比如:绑定路由键为:KH96.#.KGC,代表发送消息路由键是以KH96开头,中间可以带一个或多个单词,结尾,如KH96.KGC,KH96.aa.KGC,KH96.aa.bb.KGC 。
- 备注:
- 如果主题交换机,队列绑定的路由键使用的不是模糊匹配符,主题交换机跟直连交换机一致 。
- 如果单独使用#,代表所有队列都可以收消息,主题交换机跟扇形交换机一致 。
- *代表单个单词 。
- 提醒:
- 主题模式下,队列绑定的路由键 , 是允许为多个的 。
- 如果路由键被更换,之前的路由键是不会删除,仍然会绑定到当前队列上 。
- 如果有多个路由键匹配 , 规则为:如果其中一个没有匹配到,会自动匹配其他路由键,如果需要删除历史路由键 , 需要在RabbitMQ控制台删除 。
- 主题模式下,队列绑定的路由键 , 是允许为多个的 。
# RabbitMQ配置spring:rabbitmq:# 打开发送消息确认配置publisher-confirms: true # 发送消息到交换机确认,默认falsepublisher-returns: true # 发送消息到队列确认,默认是false
3.4.2 消息发送确认配置类- 触发机制
- ConfirmCallback 函数式接口中的唯一抽象方法 confirm : 是否有交换机都会触发;
- 标识:true,发送到交换机正常;
- 标识:false,发送到交换机失败,进行特殊处理;
- ReturnCallback 函数式接口中的唯一抽象方法 returnedMessage :交换机存在且队列不存在才会触发;
- 触发:发送到队列失败,进行特殊处理;
- ConfirmCallback 函数式接口中的唯一抽象方法 confirm : 是否有交换机都会触发;
/** * Created On : 2/11/2022. * <p> * Author : huayu * <p> * Description: RabbitMQ 消息确认机制: 发送确认 */@Slf4j@Configurationpublic class RabbitMQSendMsgAck {@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){//发送确认,消息是通过rabbitTemplate发的,所以要重置rabbitTemplate才可以实现RabbitTemplate rabbitTemplate = new RabbitTemplate();rabbitTemplate.setConnectionFactory(connectionFactory);//开启触发回调处理方法 , 不论消息推送结果是什么,都会强制触发回调方法rabbitTemplate.setMandatory(true);//指定消息发送到RabbitMQ的broker节点,是否正确到达交换机确然//是否有交换机都会触发rabbitTemplate.setConfirmCallback( (correlationData, ack, cause) ->{log.info("######发送消息确认回调,数据:{}######",correlationData);log.info("######发送消息确认回调,标识:{}######",ack);log.info("######发送消息确认回调,原因:{}######\n",cause);//TODO 如果没有到交换机,ack返回的是false,可能是交换机被删除,就需要进行特殊处理的业务,比如给负责人发送信息或邮件});//消息是否正确到达交换机上绑定的 目标队列//交换机存在且队列不存在才会触发rabbitTemplate.setReturnCallback( ( message, replyCode, replyText,exchange,routingKey) ->{log.info("######发送消息返回回调,数据:{}######",message);log.info("######发送消息返回回调,返回码:{}######",replyCode);log.info("######发送消息返回回调,返回说明:{}######",replyText);log.info("######发送消息返回回调,交换机:{}######",exchange);log.info("######发送消息返回回调,路由键:{}######\n",routingKey);//TODO 如果没有到目标队列,就需要进行特殊处理的业务 , 比如给负责人发送信息或邮件});return rabbitTemplate;}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 剑与远征8月诗社竞答第六天答案是什么
- 十六 企业级自定义表单引擎解决方案--Excel导入导出
- Oracle中查询表结构的六种方法
- 六 Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待
- 某 .NET RabbitMQ SDK 有采集行为,你怎么看?
- 梦幻西游手游妙法试炼第六章怎么通关
- 之六 2流高手速成记:从SpringBoot到SpringCloudAlibaba
- 伍六七第三季更新时间_伍六七第三季什么时候更新
- 鸡皮疙瘩第六关恐惧怎么过
- .Net Core&RabbitMQ限制循环消费