Springboot?2.x?RabbitTemplate默認消息持久化的原因解析
前言
之前在Java直接測試mq消息持久化時,采取如下的配置實現(xiàn)消息的持久化:
//消息持久化測試
Builder builder = new Builder();
builder.deliveryMode(2);
BasicProperties properties = builder.build();
channel.basicPublish("", queue_name, properties, string.getBytes());
其中針對BasicProperties中的源碼信息為:
public static class BasicProperties extends
com.rabbitmq.client.impl.AMQBasicProperties {
private String contentType;//消息類型如:text/plain
private String contentEncoding;//編碼
private Map<String,Object> headers;
private Integer deliveryMode;//1:nonpersistent 不持久 2:persistent 持久
private Integer priority;//優(yōu)先級
private String correlationId;
private String replyTo;//反饋隊列
private String expiration;//expiration到期時間
private String messageId;
private Date timestamp;
private String type;
private String userId;
private String appId;
private String clusterId;
...參照博客:消息應答(autoAck)、隊列持久化(durable)以及消息持久化
springboot測試
上面的配置是Java直接測試時,所需要編寫的代碼邏輯,如果采取springboot配置,則會出現(xiàn)默認消息持久化的現(xiàn)象。
至于測試案例,可以參考下列博客:
SpringBoot整合RabbitMQ實現(xiàn)消息確認機制
測試現(xiàn)象
首先將消息消費者代碼進行注釋。執(zhí)行接口,創(chuàng)建消息存入隊列中。



源碼分析
要想知道為什么消息會自動持久化,則需要關注rabbitTemplate.convertAndSend(exchange,routingKey,msg)這個方法。
從源碼執(zhí)行邏輯可以看出:

rabbitTemplate提供的消息加載至隊列中,采取的數(shù)據(jù)類型為Object,但在其源碼邏輯中,又將Object消息類型,進行了this.convertMessageIfNecessary(object)處理,將object對象類型轉(zhuǎn)化為Message對象類型。

從此處可以看出,rabbitTemplate為了讓開發(fā)者處理數(shù)據(jù)更簡單,將消息持久化等操作默認進行了配置。
現(xiàn)在,一起來看convertMessageIfNecessary(object)做了什么?

判斷當前的數(shù)據(jù)類型,是否是Message類型。
如果是
Message類型,則直接將其強轉(zhuǎn)Message。
如果不是,則執(zhí)行了新的方法,將其轉(zhuǎn)換了一次。
轉(zhuǎn)換過程如下所示:


后面的就不深入了。那持久化的默認配置在哪進行的?
回到最初的convertAndSend執(zhí)行方法。



該參數(shù)由類創(chuàng)建加載時生成,其數(shù)據(jù)如下所示:


聯(lián)想
也就是說,在convertMessageIfNecessary時,會判斷傳遞的參數(shù)類型是否為Message類型,如果不是則需要再包裝一次。
如果
不想設定消息持久化,傳遞的數(shù)據(jù)類型為Message類型即可!
到此這篇關于Springboot 2.x RabbitTemplate默認消息持久化的原因解析的文章就介紹到這了,更多相關Springboot 2.x RabbitTemplate默認消息持久化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JAVA spark創(chuàng)建DataFrame的方法
這篇文章主要介紹了JAVA spark創(chuàng)建DataFrame的方法,幫助大家更好的理解和學習spark,感興趣的朋友可以了解下2020-08-08
Maven及Springboot配置JDK版本,編碼,源碼打包等方式
這篇文章主要介紹了Maven及Springboot配置JDK版本,編碼,源碼打包等方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
swagger添加權限驗證保證API(接口)安全性(兩種方法)
這篇文章主要介紹了swagger添加權限驗證保證API(接口)安全性(兩種方法),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Java中static和static?final的區(qū)別詳解
這篇文章主要介紹了Java中static和static?final的區(qū)別詳解,開發(fā)時我們經(jīng)常用到static以及static?final來修飾我們的字段變量,那么他們到底有什么區(qū)別呢?其實他們的區(qū)別可以用使用字節(jié)碼文件來解析,需要的朋友可以參考下2023-10-10

