SpringBoot整合RabbitMQ的5種模式的注解綁定詳解
RabbitMQ 5種模式的注解綁定
1、導(dǎo)入依賴
<!--AMQP依賴,包含RabbitMQ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--對象轉(zhuǎn)換-->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>2、配置連接信息
spring:
rabbitmq:
host: localhost
port: 5672
username: root
password: root
virtual-host: /
# listener:
# simple:
# prefetch: 1 # 工作隊(duì)列能者多勞模式
3、5種使用模式
1、HelloWorld模式
一個(gè)隊(duì)列一個(gè)消費(fèi)者
// 消息發(fā)布
@Test
void testHelloWorldMode(){
rabbitTemplate.convertAndSend("helloworld_queue","hello world!");
}
// 消息訂閱
@RabbitListener(queuesToDeclare = {@Queue(name = "helloworld_queue")})
public void helloWorldC1(String msg){
System.out.println("helloWorldC1:-------->"+msg);
}
2、Work模式 按均分配
一個(gè)隊(duì)列,多個(gè)消費(fèi)者
注意:一條消息只能被消費(fèi)一次,默認(rèn)是按均分配,在消費(fèi)者開始消費(fèi)之前隊(duì)列中的消息就已經(jīng)分配好了
往隊(duì)列中放入50條消息
@Test
void testWorkMode(){
String msg = "work mode";
for (int i = 1; i <= 50; i++) {
rabbitTemplate.convertAndSend("work_zs_queue","work mode"+i);
}
}創(chuàng)建兩個(gè)消費(fèi)者,并且設(shè)置20ms 和 200ms 的延遲
@RabbitListener(queuesToDeclare = {@Queue(name = "work_zs_queue")})
@SneakyThrows
public void workc1(String msg){
Thread.sleep(20);
System.out.println("workc1:---------------->"+msg);
}
@RabbitListener(queuesToDeclare = {@Queue(name="work_zs_queue")})
@SneakyThrows
public void workc2(String msg){
Thread.sleep(200);
System.err.println("workc2:------------------>"+msg);
}運(yùn)行結(jié)果:
可以發(fā)現(xiàn)workc1比workc2提前完成消費(fèi)任務(wù),并且c1 c2是按照奇偶數(shù)順序消費(fèi)的任務(wù),這也進(jìn)一步驗(yàn)證了在消費(fèi)開始前就已經(jīng)分配好了任務(wù)
這種按均分配的效果效率低下,我們應(yīng)該遵循能者多勞的方式去分配任務(wù)

能者多勞
修改配置文件,讓消費(fèi)者一次只能接收一個(gè)任務(wù),當(dāng)前任務(wù)消費(fèi)完才可以接收下一個(gè)任務(wù)
spring:
rabbitmq:
host: 192.168.137.7
port: 5672
username: root
password: root
virtual-host: /
listener: # 消息確認(rèn)機(jī)制
simple:
prefetch: 1
重新啟動(dòng)運(yùn)行代碼
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-yC6unliz-1651579009611)(項(xiàng)目規(guī)約.assets/image-20220503170440687.jpg)]](http://img.jbzj.com/file_images/article/202401/202401251019489.jpg)
3、Fanout模式
fanout模式也叫廣播模式,每一條消息多可以被綁定在同一個(gè)交換機(jī)上的所有隊(duì)列的消費(fèi)者消費(fèi)

參數(shù)1:交換機(jī):fanout_exchange
參數(shù)2:routingkey 在fanout模式不使用,會在direct和topic模式使用
參數(shù)3:發(fā)送的消息
@Test
void testFanoutMode(){
rabbitTemplate.convertAndSend("fanout_exchange","","fanout mode 1");
rabbitTemplate.convertAndSend("fanout_exchange","","fanout mode 2");
}
定義消費(fèi)者
使用@RabbitListener注解中的bindings聲明并綁定交換機(jī)和隊(duì)列
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "fanout_queue1"),
exchange = @Exchange(name = "fanout_exchange2",type = ExchangeTypes.FANOUT)
))
public void fanoutc1(String msg){
System.out.println("fanoutc1:------------------>"+msg);
}
@RabbitListener(bindings=@QueueBinding(
value = @Queue(name = "fanout_queue2"),
exchange = @Exchange(name = "fanout_exchange2",type = ExchangeTypes.FANOUT)
))
public void fanoutc2(String msg){
System.out.println("fanoutc1:------------------>"+msg);
}運(yùn)行結(jié)果:
每一條消息都會被所有消費(fèi)者消費(fèi)

4、direct模式
direct模式與fanout模式的區(qū)別在于,隊(duì)列都是綁定同一個(gè)交換機(jī),但是在隊(duì)列上會添加routingkey標(biāo)識
消費(fèi)者會根據(jù)不同的表示去消費(fèi)對應(yīng)隊(duì)列中的消息
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct_queue1"),
exchange = @Exchange(name = "direct_zs_exchange",type = ExchangeTypes.DIRECT),
key = "zs_news1"
))
public void direct1(String msg){
System.out.println("direct_queuq1:---------------------->"+msg);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct_queue2"),
exchange = @Exchange(name = "direct_zs_exchange",type = ExchangeTypes.DIRECT),
key = "zs_news2"
))
public void direct2(String msg){
System.out.println("direct_queuq2:---------------------->"+msg);
}
@Test
void testDirectMode(){
rabbitTemplate.convertAndSend("direct_zs_exchange","zs_news1","direct mode1");
rabbitTemplate.convertAndSend("direct_zs_exchange","zs_news2","direct mode2");
}
5、topic模式
- Topic交換機(jī)接收的消息RoutingKey必須是多個(gè)單詞,以 **.** 分割
- Topic交換機(jī)與隊(duì)列綁定時(shí)的bindingKey可以指定通配符
- #:代表0個(gè)或多個(gè)詞
- *:代表1個(gè)詞
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic_queue1"),
exchange = @Exchange(name = "topic_zs_exchange",type = ExchangeTypes.TOPIC),
key = "zs_new.#"
))
public void topic1(String msg){
User user = JSONUtil.toBean(msg, User.class);
System.out.println(user.toString());
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "topic_queue1"),
exchange = @Exchange(name = "topic_zs_exchange",type = ExchangeTypes.TOPIC),
key = "#.zs_new"
))
public void topic2(String msg){
User user = JSONUtil.toBean(msg, User.class);
System.out.println(user.toString());
}
@Test
void testTopicMode(){
String jsonStr1 = JSONUtil.toJsonStr(new User("小爽", 22));
rabbitTemplate.convertAndSend("topic_zs_exchange","zs_new.user",jsonStr1);
String jsonStr2 = JSONUtil.toJsonStr(new User("路飛", 17));
rabbitTemplate.convertAndSend("topic_zs_exchange","lufei.zs_new",jsonStr2);
}![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-bM3FuukA-1651579009617)(使用攻略.assets/image-20220503195525092.jpg)]](http://img.jbzj.com/file_images/article/202401/2024012510194915.jpg)
到此這篇關(guān)于SpringBoot整合RabbitMQ的5種模式的注解綁定詳解的文章就介紹到這了,更多相關(guān)RabbitMQ 5種模式的注解綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)n位數(shù)字的全排列
今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)n位數(shù)字的全排列,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
掌握這4個(gè)配置點(diǎn)輕輕松松實(shí)現(xiàn)VSCode多JDK版本自由切換
眾所周知在VSCode中切換JDK版本可以通過多種方式實(shí)現(xiàn),具體取決于你使用的開發(fā)環(huán)境和項(xiàng)目類型,這篇文章主要介紹了如何實(shí)現(xiàn)VSCode多JDK版本自由切換的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2026-02-02
springboot集成swagger3與knife4j的詳細(xì)代碼
這篇文章主要介紹了springboot集成swagger3與knife4j,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull)
這篇文章主要介紹了Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull),數(shù)據(jù)庫的字段命名方式為使用下劃線連接,對應(yīng)的實(shí)體類應(yīng)該是駝峰命名方式,而我使用的是和數(shù)據(jù)庫同樣的命名方式,需要的朋友可以參考下2022-01-01
java8新特性之stream的collect實(shí)戰(zhàn)教程
這篇文章主要介紹了java8新特性之stream的collect實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

