Springboot?2.x?RabbitTemplate默認(rèn)消息持久化的原因解析
前言
之前在Java直接測(cè)試mq消息持久化時(shí),采取如下的配置實(shí)現(xiàn)消息的持久化:
//消息持久化測(cè)試 Builder builder = new Builder(); builder.deliveryMode(2); BasicProperties properties = builder.build(); channel.basicPublish("", queue_name, properties, string.getBytes());
其中針對(duì)BasicProperties
中的源碼信息為:
public static class BasicProperties extends com.rabbitmq.client.impl.AMQBasicProperties { private String contentType;//消息類(lèi)型如:text/plain private String contentEncoding;//編碼 private Map<String,Object> headers; private Integer deliveryMode;//1:nonpersistent 不持久 2:persistent 持久 private Integer priority;//優(yōu)先級(jí) private String correlationId; private String replyTo;//反饋隊(duì)列 private String expiration;//expiration到期時(shí)間 private String messageId; private Date timestamp; private String type; private String userId; private String appId; private String clusterId; ...
參照博客:消息應(yīng)答(autoAck)、隊(duì)列持久化(durable)以及消息持久化
springboot測(cè)試
上面的配置是Java直接測(cè)試時(shí),所需要編寫(xiě)的代碼邏輯,如果采取springboot配置,則會(huì)出現(xiàn)默認(rèn)消息持久化
的現(xiàn)象。
至于測(cè)試案例,可以參考下列博客:
SpringBoot整合RabbitMQ實(shí)現(xiàn)消息確認(rèn)機(jī)制
測(cè)試現(xiàn)象
首先將消息消費(fèi)者
代碼進(jìn)行注釋
。執(zhí)行接口,創(chuàng)建消息存入隊(duì)列中。
源碼分析
要想知道為什么消息會(huì)自動(dòng)持久化
,則需要關(guān)注rabbitTemplate.convertAndSend(exchange,routingKey,msg)
這個(gè)方法。
從源碼執(zhí)行邏輯可以看出:
rabbitTemplate
提供的消息加載至隊(duì)列中,采取的數(shù)據(jù)類(lèi)型為Object
,但在其源碼邏輯中,又將Object
消息類(lèi)型,進(jìn)行了this.convertMessageIfNecessary(object)
處理,將object
對(duì)象類(lèi)型轉(zhuǎn)化為Message
對(duì)象類(lèi)型。
從此處可以看出,rabbitTemplate
為了讓開(kāi)發(fā)者處理數(shù)據(jù)更簡(jiǎn)單,將消息持久化
等操作默認(rèn)進(jìn)行了配置
。
現(xiàn)在,一起來(lái)看convertMessageIfNecessary(object)
做了什么?
判斷當(dāng)前的數(shù)據(jù)類(lèi)型,是否是Message類(lèi)型
。
如果是
Message
類(lèi)型,則直接將其強(qiáng)轉(zhuǎn)Message
。
如果不是,則執(zhí)行了新的方法,將其轉(zhuǎn)換了一次。
轉(zhuǎn)換過(guò)程如下所示:
后面的就不深入了。那持久化的默認(rèn)配置在哪進(jìn)行的?
回到最初的convertAndSend
執(zhí)行方法。
該參數(shù)由類(lèi)創(chuàng)建加載時(shí)生成,其數(shù)據(jù)如下所示:
聯(lián)想
也就是說(shuō),在convertMessageIfNecessary
時(shí),會(huì)判斷傳遞的參數(shù)類(lèi)型是否為Message
類(lèi)型,如果不是則需要再包裝一次。
如果
不想設(shè)定消息持久化
,傳遞的數(shù)據(jù)類(lèi)型為Message
類(lèi)型即可!
到此這篇關(guān)于Springboot 2.x RabbitTemplate默認(rèn)消息持久化的原因解析的文章就介紹到這了,更多相關(guān)Springboot 2.x RabbitTemplate默認(rèn)消息持久化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA spark創(chuàng)建DataFrame的方法
這篇文章主要介紹了JAVA spark創(chuàng)建DataFrame的方法,幫助大家更好的理解和學(xué)習(xí)spark,感興趣的朋友可以了解下2020-08-08java中Spring Security的實(shí)例詳解
這篇文章主要介紹了java中Spring Security的實(shí)例詳解的相關(guān)資料,spring security是一個(gè)多方面的安全認(rèn)證框架,提供了基于JavaEE規(guī)范的完整的安全認(rèn)證解決方案,需要的朋友可以參考下2017-09-09Maven及Springboot配置JDK版本,編碼,源碼打包等方式
這篇文章主要介紹了Maven及Springboot配置JDK版本,編碼,源碼打包等方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12關(guān)于Mybatis使用collection分頁(yè)問(wèn)題
項(xiàng)目中mybatis分頁(yè)的場(chǎng)景是非常高頻的,當(dāng)使用ResultMap并配置collection做分頁(yè)的時(shí)候,我們可能會(huì)遇到獲取當(dāng)前頁(yè)的數(shù)據(jù)少于每頁(yè)大小的數(shù)據(jù)問(wèn)題。接下來(lái)通過(guò)本文給大家介紹Mybatis使用collection分頁(yè)問(wèn)題,感興趣的朋友一起看看吧2021-11-11java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法
這篇文章主要介紹了java實(shí)現(xiàn)分布式項(xiàng)目搭建的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04swagger添加權(quán)限驗(yàn)證保證API(接口)安全性(兩種方法)
這篇文章主要介紹了swagger添加權(quán)限驗(yàn)證保證API(接口)安全性(兩種方法),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java中static和static?final的區(qū)別詳解
這篇文章主要介紹了Java中static和static?final的區(qū)別詳解,開(kāi)發(fā)時(shí)我們經(jīng)常用到static以及static?final來(lái)修飾我們的字段變量,那么他們到底有什么區(qū)別呢?其實(shí)他們的區(qū)別可以用使用字節(jié)碼文件來(lái)解析,需要的朋友可以參考下2023-10-10