rabbitmq生产与消费

一、rabbitmq发送消息

一、简单模式

概述

复制代码
     一个生产者一个消费者

模型

代码

java 复制代码
//没有交换机,两个参数为routingKey和消息内容
rabbitTemplate.convertAndSend("test1_Queue","haha");

二、工作队列模式

概述

复制代码
  一个生产者,多个消费者,消费者之间负载均衡

模型

代码

java 复制代码
	//没有交换机,两个参数为routingKey和消息内容
    rabbitTemplate.convertAndSend("test1_Queue","haha");

三、发布订阅模式

概述

复制代码
生产者把消息给交换机,交换机把消息推送给与它绑定的所有队列,消费者监听自己的队列

模型

代码

java 复制代码
//该模式下,交换机与队列绑定无需routingkey,因此效率最高
rabbitTemplate.convertAndSend("fanout_Exchange","","lala");

四、路由模式

概述

复制代码
交换机与队列由routing key绑定,生产者发送消息时指定交换机和routing key,则对应的队列便会收到消息

模型

代码

java 复制代码
 rabbitTemplate.convertAndSend("direct_Exchange","test1_Queue","lala");

五、主题模式(通配符模式)

概述

复制代码
交换机与队列由routing key绑定,但routing key由通配符和具体的字符组成,生产者输入具体的字符,交换机根据routing key的规则模糊匹配到对应的队列,则对应的队列会收到消息

模型

代码

java 复制代码
/**
 * 交换机与队列绑定
 * @return
 */
@Bean
Binding truckHistoryBinding(){
    return BindingBuilder.bind(test1Queue()).to(topicExchange()).with("*.test1.*");
}


@GetMapping("/sendMessage")
public void sendMessage() {
	//需要字符串的模糊匹配,效率最低
    rabbitTemplate.convertAndSend("topic_Exchange","aa.test1.cc","lala");
}

二、rabbitmq接收消息

一、拉模式

概述

复制代码
 消费者可以主动拉取队列里的消息

代码

java 复制代码
rabbitTemplate.execute(channel->{
    //通过channel.basicGet方法可以单条获取消息,其返回值时GetReponse
    GetResponse response =  channel.basicGet("my_queue",false);
    String message = new String(response.getBody());
  }
)

二、推模式

概述

复制代码
通过发布订阅模式,订阅队列里的消息

代码

java 复制代码
 @RabbitListener(queues="my_queue")
 public void onMessage(Message messge,Channel channel){
    String msg = new String (message.getBody());
 }

三、消息的手动确认

注意:

手动确认需要先将自动确认的配置注释掉;

消息确认模式有:

AcknowledgeMode.NONE:自动确认

AcknowledgeMode.AUTO:根据情况确认

AcknowledgeMode.MANUAL:手动确认

默认情况下消息消费者是自动 ack (确认)消息的,如果要手动 ack(确认)则需要修改确认模式为 manual

java 复制代码
spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: manual

或在 RabbitListenerContainerFactory 中进行开启手动 ack

java 复制代码
@Bean
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setMessageConverter(new Jackson2JsonMessageConverter());
    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);             //开启手动 ack
    return factory;
}

消费消息手动确认的监听器

获取消息消费的唯一标识

java 复制代码
message.getMessageProperties().getDeliveryTag();

执行业务处理

消息确认

java 复制代码
  //消费消息的手动确认,消息确认成功-basicAck
  //第一个参数deliveryTag,消息的唯一标识
  //第二个参数multiple,消息是否支持批量确认,如果是true,代表可以一次性确认标识小于等于当前标识的所有消息
  //如果是false,只会确认当前消息
   channel.basicAck(deliveryTag,false);

消息确认失败处理,根据条件判断设置是否重回队列 ,是否支持批量处理

java 复制代码
  			//说明消费消息处理失败,如果不进行确认(自动确认,投递成功即确认,消费是否正常,不关心),消息就会丢失
            //消息处理失败确认,代表消息没有正确消费,注意:此种方式一次只能确认一个消息
            //第一给参数是消息的唯一标识,
            //第二个参数是代表是否重回队列,如果是true,重新将该消息放入队列,再次消费
            //注意:第二个参数要谨慎,必须要结合具体业务场景,根据业务判断是否需要重回队列,一旦处理不当,机会导致消息循环入队,消息挤压
            //不重回队列 require = false
//            channel.basicReject(deliveryTag,false);
            //重回队列 require = true
            channel.basicReject(deliveryTag,true);

            //消息处理失败确认,代表消息没有正确消费,注意,此种方式支持批量
            //第一个参数是消息的唯一标识,
            //第二个参数是代表是否支持批量确认
            //第三给参数代表是否重回队列
            //不重回队列 require = false
           channel.basicNack(deliveryTag,true,false);
            //重回队列 require = true
           channel.basicNack(deliveryTag,false,true);
相关推荐
爱丽_18 分钟前
Redis 分布式锁:SET NX、过期时间、续租、可重入、Redlock 与坑
数据库·redis·分布式
ok_hahaha3 小时前
java从头开始-黑马点评-分布式锁-redis实现基础版
java·redis·分布式
传感器与混合集成电路3 小时前
法珀干涉与光栅补偿:井下压力温度一体化光纤监测技术
分布式
@insist1234 小时前
数据库系统工程师-分布式数据库与数据仓库核心考点及应用体系
数据库·数据仓库·分布式·软考·数据库系统工程师·软件水平考试
XDHCOM5 小时前
TP5框架Redis分布式缓存实战,解决高并发场景下的数据一致性问题
redis·分布式·缓存
Fzuim5 小时前
从CLI到分布式智能体:重新理解AI Agent的演进路径与工程现实
人工智能·分布式·ai·agent·agentic
_院长大人_8 小时前
Spring Boot 3.3 + Atomikos 分布式事务日志路径配置踩坑记录
spring boot·分布式·后端
Data 实验室8 小时前
TaskPyro “小龙虾版本”专业爬虫管理平台来了:AI+分布式+IM 机器人,一套搞定企业级爬虫调度
人工智能·分布式·爬虫
想你依然心痛8 小时前
HarmonyOS 5.0教育行业解决方案:基于分布式能力的沉浸式智慧课堂系统
分布式·wpf·harmonyos
糖炒栗子03269 小时前
后端异步任务编排:基于 RabbitMQ 的“中控-工人”模式
java·rabbitmq