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);
相关推荐
茶杯梦轩4 天前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
回家路上绕了弯6 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
用户8307196840826 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
用户8307196840828 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者9 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者11 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧12 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖12 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农12 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者12 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端