RabbitMQ(六)消息的持久化_rabbittemplate,2024年最新薪资翻倍

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

    this(name, true, false);
}
...

}


#### 方式二:channel.exchangeDeclare()


在 RabbitMQ 的原生 API 中,例如:Java 客户端 API,声明持久化交换机时,需要将 `durable` 参数设置为 `true`:



// 声明交换机:(交换机名称,交换机类型,持久化)
channel.exchangeDeclare(“myExchange”, “direct”, true);


#### 方式三:ExchangeBuilder【推荐】


在 Spring AMQP 中,我们可以使用 `ExchangeBuilder` 来创建持久化的交换机:



import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;

Exchange exchange = ExchangeBuilder.directExchange(“myExchange”)
.durable(true) // 交换机持久化
.build();




---


### 三、队列的持久化


#### 方式一:直接 new


直接实例化 `Queue` 类即可,默认:**持久化的、非独占的、非自动删除的**。



@Bean
public Queue myQueue() {
return new Queue(“myQueue”);
}


`Queue` 源码:



package org.springframework.amqp.core;

public Queue(String name) {
// 默认是持久化的、非独占的、非自动删除的。
this(name, true, false, false);
}


#### 方式二:channel.queueDeclare()


在原生 RabbitMQ API 中,例如 Java 客户端 API,声明持久化队列时,需要将 `durable` 参数设置为 `true`:



// 声明队列:(队列名称,持久化,非独占,非自动删除,可选队列参数)
channel.queueDeclare(“myQueue”, true, false, false, null);


#### 方式三:QueueBuilder【推荐】


在 Spring AMQP 中,可以使用 `QueueBuilder` 来创建持久化的队列:



import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;

Queue queue = QueueBuilder.durable(“myQueue”).build();




---


### 四、消息的持久化


即使队列时持久化的,发送到队列中的消息 **默认是持久化的**。我们也可以手动配置使消息持久化,需要在发送消息时设置消息属性为持久化。


**RabbtTemplate.java 源码:**



package org.springframework.amqp.rabbit.core;

public class RabbitTemplate extends RabbitAccessor implements BeanFactoryAware, … {

...
// 没有手动指定MessagePostProcessor时
@Override
public void convertAndSend(String exchange, String routingKey, final Object object,
		@Nullable CorrelationData correlationData) throws AmqpException {

	send(exchange, routingKey, convertMessageIfNecessary(object), correlationData);
}

// 初始化MessageProperties
protected Message convertMessageIfNecessary(final Object object) {
	if (object instanceof Message) {
		return (Message) object;
	}
	return getRequiredMessageConverter().toMessage(object, new MessageProperties());
}
...

}


**MessageProperties.java 源码:**



package org.springframework.amqp.core;

public class MessageProperties implements Serializable {

...
// 消息默认为持久化
public static final MessageDeliveryMode DEFAULT\_DELIVERY\_MODE = MessageDeliveryMode.PERSISTENT;

private MessageDeliveryMode deliveryMode = DEFAULT\_DELIVERY\_MODE;
...

}


#### 方式一:channel.basicPublish()


在原生 RabbitMQ API 中,例如 Java 客户端 API,声明持久化消息时,需要将 `deliveryMode` 参数设置为 `2`:



import com.rabbitmq.client.AMQP;

AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.deliveryMode(2) // 这里2对应MessageDeliveryMode.PERSISTENT
.build();

// 参数:(交换机,路由键,消息的其他参数,消息体)
channel.basicPublish(“myExchange”, “myRoutingKey”, props. messageBytes);


或者,我们可以直接使用 `MessageProperties.PERSISTENT_TEXT_PLAIN` 来进行指定消息的持久化:



import com.rabbitmq.client.MessageProperties;

// 参数:(交换机,路由键,消息的其他参数,消息体)
channel.basicPublish(“myExchange”, “myRoutingKey”, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());


#### 方式二:rabbitTemplate.convertAndSend()【推荐】


在 Spring AMQP 中,可以使用 `rabbitTemplate.convertAndSend()` 来创建持久化的消息:



rabbitTemplate.convertAndSend(“myQueue”, body, message -> {
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
return message;
});


通过上述步骤,消息会被持久化存储,只要队列也被正确配置为持久化,即使 RabbitMQ 服务器重启,消息也将被保留下来。



> 
> **补充:**
> 
> 
> 然而,**即使队列和消息都是持久化的,也不能完全保证消息的 100% 不丢失**。例如:在消息尚未被刷写到磁盘时,RabbitMQ 服务器突然崩溃,这种情况下的消息仍然可能会丢失。此外,**RabbitMQ 不保证消息的立即持久化,而是尽可能快地将消息保存到磁盘**。


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/a18e0d9942ae7ef285e217225b090e9a.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
[外链图片转存中...(img-EPev9qam-1713151721706)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值