在消費端,我們的消費***是執行在 ***容器之中的(listenercontainer
),springboot 給我們提供了兩個***容器******messagelistenercontainer
和directmessagelistenercontainer
在配置檔案中凡是以spring.rabbitmq.listener.******
開頭的就是對第乙個容器的配置,以spring.rabbitmq.listener.direct
開頭的是對第二個容器的配置。其實這兩個容器類讓我很費勁;首先官方文件並沒有說哪個是預設的容器,似乎兩個都能用;其次,它說這個容器預設是單例模式的,但它又提供了工廠方法,而且我們看@rabbitlistener
註解原始碼:
target()
@retention
(retentionpolicy.runtime)
@documented
@repeatable
(rabbitlisteners.
class
)public @inte***ce
rabbitlistener
它是指定乙個containe***ctory
那我通過@bean
註解註冊乙個listenercontainer
` 到底有沒有用。
保險起見這裡教程中建議註冊乙個containe***ctory
而不是乙個單例的listenercontainer
那我可以對這個容器工廠做哪些設定呢。它的官方文件其中前往提到的序列化問題就可以配置這個工廠bean來解決:
@bean
public ******rabbitlistenercontaine***ctory rabbitlistenercontaine***ctory
(connectionfactory connectionfactory)
除此之外 它還能設定事務的長度,消費者併發數,訊息重試的相關引數等。小夥伴自己按需查閱資料去進行嘗試,這裡由於篇幅問題就不做說明了。
在 rabbit3.6 版本引入了惰性佇列的的概念;預設情況下佇列的訊息會盡可能的儲存在記憶體之中,這樣可以更加快速的將訊息傳送給消費者,就算持久化的訊息也會在記憶體中做備份。當 rabbit 需要釋放記憶體的時候,會將記憶體中的訊息寫入磁碟。這個操作不僅耗時還阻塞佇列,讓佇列無法寫入訊息。於是 rabbit 將佇列分為了兩中模式——default
模式和lazy
模式來解決這一問題。lazy
模式即為惰性佇列的模式。惰性佇列 通過引數x-queue-mode
來配置,**可參考死信佇列,通過queuebuilder
的withargument
來指定引數。
惰性佇列和普通佇列相比,只有很小的記憶體開銷。惰性佇列會將訊息直接寫入到磁碟,需要消費的時候再取出來。當訊息量級很大,記憶體完全不夠用的時候,普通佇列要經歷這樣的過程——將訊息讀到記憶體 —> 記憶體滿了需要給後面的訊息騰地方,將訊息寫入磁碟—>消費到這條訊息,將訊息又讀入記憶體。所以當訊息量級很大的時候,惰性佇列效能要好過普通佇列,當記憶體完全夠用的時候則不然。
事務特性是針對生產者投遞訊息而言的,對我們的專案來說 rabbit 的事務是很重要的;假如沒有事務特性,在乙個方法中,資料庫插入資料失敗回滾了,而對應的訊息卻無法回滾,就會產生一條錯誤的訊息。
rabbit 中的事務機制和 callable 機制是互斥的,也就是說只有spring.rabbitmq.template.mandatory=false
的時候才能使用。rabbit 事務的宣告,提交,回滾的方法是channel的txselect()
,txcoomit()
,txrollback()
。但是在 springboot 我們大可不必去手動提交和回滾,可以使用 spring 的宣告式事務,上**:
@component
@order(1
)public
class
rabbitconfig
}
生產者:
@service
public
class
rabbittestservice
thread.
sleep
(1000);
throw
newruntimeexception()
;}}
通過管理介面和,消費者列印視窗,可確定宣告式事務是否配置成功。
備胎機顧名思義就是替代現任的備胎,「正主」 沒了後可以及時上位。在rabbitmq中,如果生產者傳送訊息,由於路由錯誤等原因不能到達指定佇列,就會路由到備胎佇列消費。這樣做可以保證未被路由的訊息不會丟失。
備胎交換機的引數為alternate-exchange
來指定做誰的備胎:
@bean
public directexchange alternateexchange()
@bean
public fanoutexchange bos***change()
出處:
通過HelloSpring了解Spring的IOC
在dao層建立乙個hello實體類。package dao public class hello public void setstr string str override public string tostring 然後要輸出就要建立物件,在spring中,有乙個ioc池,需要使用物件就在池裡...
1019 數字黑洞(sscanf和sprintf)
給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的 6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 7...
SpringMVC學習筆記之與Spring的關係
需要進行 spring 整合 springmvc 嗎 還是否需要再加入 spring 的 ioc 容器嗎 是否需要再 web.xml 檔案中配置啟動 spring ioc 容器 contextloaderlistener 嗎 需要 通常情況下,類似於資料來源 事務 整合其它框架都是放在spring ...