RabbitMQ(四)事务消息,惰性队列,优先队列

2024-06-01 15:52

本文主要是介绍RabbitMQ(四)事务消息,惰性队列,优先队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 事务消息
    • 概念
    • 配置
  • 惰性队列
    • 概念
    • 应用场景
  • 优先队列
    • 概念
    • 配置

事务消息

仅在生产者端有效消费端无效

概念

在这里插入图片描述

总结:

  • 在生产者端使用事务消息和消费端没有关系
  • 在生产者端使用事务消息仅仅是控制事务内的消息是否发送
  • 提交事务就把事务内所有消息都发送到交换机
  • 回滚事务则事务内任何消息都不会被发送

配置

// 配置
import lombok.Data;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@Data
public class RabbitConfig {@Beanpublic RabbitTransactionManager transactionManager(CachingConnectionFactory connectionFactory) {return new RabbitTransactionManager(connectionFactory);}@Beanpublic RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setChannelTransacted(true);return rabbitTemplate;}
}
//测试@SpringBootTest
@Slf4j
public class RabbitMQTest {public static final String EXCHANGE_NAME = "exchange.tx.dragon";public static final String ROUTING_KEY = "routing.key.tx.dragon";@Autowiredprivate RabbitTemplate rabbitTemplate;@Test@Transactional@Rollback(value = true) // junit 默认回滚事务,所以想提交事务就设置为 falsepublic void testSendMessageInTx() {// 1、发送第一条消息rabbitTemplate.convertAndSend(EXCHANGE_NAME, ROUTING_KEY, "I am a dragon(tx msg ~~~01~~~)");// 2、抛出异常log.info("do bad:" + 10 / 0);// 3、发送第二条消息rabbitTemplate.convertAndSend(EXCHANGE_NAME, ROUTING_KEY, "I am a dragon(tx msg ~~~02~~~)");}}

惰性队列

概念

创建队列时,在Durability这里有两个选项可以选择

  • Durable:持久化队列,消息会持久化到硬盘上
  • Transient:临时队列,不做持久化操作,broker重启后消息会丢失
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    https://www.rabbitmq.com/docs/lazy-queues

经典队列中的消息会尽可能早地移动到磁盘。 只有当使用者请求这些消息时,它们才会加载到 RAM 中

在这里插入图片描述
会从硬盘中读取,只能作为权宜之计

应用场景

在这里插入图片描述
在这里插入图片描述

优先队列

概念

默认情况:基于队列先进先出的特性,通常来说,先入队的先投递

  • 设置优先级之后:优先级高的消息更大几率先投递
  • 关键参数:x-max-priority

RabbitMQ允许我们使用一个正整数给消息设定优先级

  • 消息的优先级数值取值范围:1~255
  • RabbitMQ官网建议在1~5之间设置消息的优先级(优先级越高,占用CPU、
    内存等资源越多)

队列在声明时可以指定参数:x-max-priority

  • 默认值:0 此时消息即使设置优先级也无效
  • 指定一个正整数值:消息的优先级数值不能超过这个值

配置

配置exchange:exchange.test.priority
在这里插入图片描述
配置队列:queue.test.priority
x-max-priority
在这里插入图片描述

// 生产者:发三个从1开始,优先级越大消费的时候越在前面消费
// 下面是发一条消息的示例public static final String EXCHANGE_PRIORITY = "exchange.test.priority";
public static final String ROUTING_KEY_PRIORITY = "routing.key.test.priority";
@Test
public void test06SendMessage() {rabbitTemplate.convertAndSend(EXCHANGE_PRIORITY, ROUTING_KEY_PRIORITY, "message test proirity 3", message -> {// 消息本身的优先级数值// 切记:不能超过 x-max-priority:	10message.getMessageProperties().setPriority(3);return message;});
}
// 消费者
@Component
@Slf4j
public class MyMessageListener {public static final String QUEUE_PRIORITY = "queue.test.priority";@RabbitListener(queues = {QUEUE_PRIORITY})public void processMessagePriority(String dataString, Message message, Channel channel) throws IOException {log.info("[priority]" + dataString);channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);}
}

在这里插入图片描述

这篇关于RabbitMQ(四)事务消息,惰性队列,优先队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021442

相关文章

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,