六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)( 五 )

3.3.5 请求测试3.3.5.1 场景1:使用唯一路由键发送消息路由键名: rabbitmq_topic_routing_key_kh96.only发起请求:

六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
请求结果:队列One,Two,Three都接收到了信息,所以对应的消费者One,Two,Three都消费了信息;
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
3.3.5.2 场景2:使用单词匹配路由键发送消息路由键名: rabbitmq_topic_routing_key_kh96.abc发起请求:
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
请求结果:队列Two,Three都接收到了信息 , 所以对应的消费者Two,Three都消费了信息;
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
3.3.5.3 场景3:0 或多词匹配发送消息路由键名: rabbitmq_topic_routing_key_kh96.abc.def发起请求:
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
请求结果:只有队列Three接收到了信息,所以只有对应的消费者Three消费了信息;
六 SpringCloud - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

文章插图
3.3.6 主题模式小结
  1. 当生产者发送消息到交换机,指定的路由键一般都是使用句点(.)作为分隔符,分割多个单词 。
    • 比如:词1.词...
  2. 所谓单词:是由一个或多个单词组成,多个单词组成的路由键,就代表某种主题的关键信息,路由键长度最多不能超过256字节 。
  3. 匹配规则格式:* 或者 #
    • *代表单个单词 。
      • 比如 队列绑定主题交换机的 路由键: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 。
    1. 备注:
      • 如果主题交换机,队列绑定的路由键使用的不是模糊匹配符,主题交换机跟直连交换机一致 。
      • 如果单独使用#,代表所有队列都可以收消息,主题交换机跟扇形交换机一致 。
  4. 提醒:
    • 主题模式下,队列绑定的路由键 , 是允许为多个的 。
    • 如果路由键被更换,之前的路由键是不会删除,仍然会绑定到当前队列上 。
    • 如果有多个路由键匹配 , 规则为:如果其中一个没有匹配到,会自动匹配其他路由键,如果需要删除历史路由键 , 需要在RabbitMQ控制台删除 。
3.4 消息发送确认 - 交换机,队列 确认3.4.1 配置信息# RabbitMQ配置spring:rabbitmq:# 打开发送消息确认配置publisher-confirms: true # 发送消息到交换机确认,默认falsepublisher-returns: true # 发送消息到队列确认,默认是false3.4.2 消息发送确认配置类
  • 触发机制
    • ConfirmCallback 函数式接口中的唯一抽象方法 confirm : 是否有交换机都会触发;
      • 标识:true,发送到交换机正常;
      • 标识:false,发送到交换机失败,进行特殊处理;
    • ReturnCallback 函数式接口中的唯一抽象方法 returnedMessage :交换机存在且队列不存在才会触发;
      • 触发:发送到队列失败,进行特殊处理;
/** * 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;}}

推荐阅读