SpringBoot整合RabbitMQ的5種模式的注解綁定詳解
RabbitMQ 5種模式的注解綁定
1、導(dǎo)入依賴
<!--AMQP依賴,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--對(duì)象轉(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)行代碼
3、Fanout模式
fanout模式也叫廣播模式,每一條消息多可以被綁定在同一個(gè)交換機(jī)上的所有隊(duì)列的消費(fèi)者消費(fèi)
參數(shù)1:交換機(jī):fanout_exchange
參數(shù)2:routingkey 在fanout模式不使用,會(huì)在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é)果:
每一條消息都會(huì)被所有消費(fèi)者消費(fèi)
4、direct模式
direct模式與fanout模式的區(qū)別在于,隊(duì)列都是綁定同一個(gè)交換機(jī),但是在隊(duì)列上會(huì)添加routingkey標(biāo)識(shí)
消費(fèi)者會(huì)根據(jù)不同的表示去消費(fèi)對(duì)應(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); }
到此這篇關(guān)于SpringBoot整合RabbitMQ的5種模式的注解綁定詳解的文章就介紹到這了,更多相關(guān)RabbitMQ 5種模式的注解綁定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android中幾種圖片特效的處理的實(shí)現(xiàn)方法
這篇文章主要介紹了 Android中幾種圖片特效的處理的實(shí)現(xiàn)方法的相關(guān)資料,這里有放大縮小圖片,獲得圓角圖片,獲得帶倒影圖片的幾種方法,需要的朋友可以參考下2017-08-08Spring IOC和DI實(shí)現(xiàn)原理及實(shí)例解析
這篇文章主要介紹了Spring IOC和DI實(shí)現(xiàn)原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06教你怎么用java實(shí)現(xiàn)客戶端與服務(wù)器一問一答
這篇文章主要介紹了教你怎么用java實(shí)現(xiàn)客戶端與服務(wù)器一問一答,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id
這篇文章主要介紹了mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08packages思維及使用Java添加Android平臺(tái)特定實(shí)現(xiàn)
這篇文章主要為大家介紹了packages思維及使用Java添加Android平臺(tái)特定實(shí)現(xiàn)在Flutter框架里的體現(xiàn)和運(yùn)用詳解,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12