rabbitMQ結合spring boot使用三

2021-10-24 10:28:48 字數 2708 閱讀 5496

在消費端,我們的消費***是執行在 ***容器之中的(listenercontainer),springboot 給我們提供了兩個***容器******messagelistenercontainerdirectmessagelistenercontainer在配置檔案中凡是以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來配置,**可參考死信佇列,通過queuebuilderwithargument來指定引數。

惰性佇列和普通佇列相比,只有很小的記憶體開銷。惰性佇列會將訊息直接寫入到磁碟,需要消費的時候再取出來。當訊息量級很大,記憶體完全不夠用的時候,普通佇列要經歷這樣的過程——將訊息讀到記憶體 —> 記憶體滿了需要給後面的訊息騰地方,將訊息寫入磁碟—>消費到這條訊息,將訊息又讀入記憶體。所以當訊息量級很大的時候,惰性佇列效能要好過普通佇列,當記憶體完全夠用的時候則不然。

事務特性是針對生產者投遞訊息而言的,對我們的專案來說 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 ...