最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合RabbitMQ的5種模式的注解綁定詳解

 更新時(shí)間:2024年01月25日 10:24:22   作者:小爽帥到拖網(wǎng)速  
這篇文章主要介紹了SpringBoot整合RabbitMQ的5種模式的注解綁定詳解,RabbitMQ 是一個(gè)消息中間件,它接收消息并且轉(zhuǎn)發(fā),是"消費(fèi)-生產(chǎn)者模型"的一個(gè)典型的代表,一端往消息隊(duì)列中不斷的寫入消息,而另一端則可以讀取或者訂閱隊(duì)列中的消息,需要的朋友可以參考下

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)]

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)]

到此這篇關(guān)于SpringBoot整合RabbitMQ的5種模式的注解綁定詳解的文章就介紹到這了,更多相關(guān)RabbitMQ 5種模式的注解綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)n位數(shù)字的全排列

    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版本自由切換

    掌握這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的詳細(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)

    這篇文章主要介紹了Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢?yōu)镹ull),數(shù)據(jù)庫的字段命名方式為使用下劃線連接,對應(yīng)的實(shí)體類應(yīng)該是駝峰命名方式,而我使用的是和數(shù)據(jù)庫同樣的命名方式,需要的朋友可以參考下
    2022-01-01
  • 深入理解 Java注解及實(shí)例

    深入理解 Java注解及實(shí)例

    這篇文章主要介紹了深入理解 Java注解及實(shí)例的相關(guān)資料,希望通過本文大家能夠掌握java注解的知識,需要的朋友可以參考下
    2017-09-09
  • java8新特性之stream的collect實(shí)戰(zhàn)教程

    java8新特性之stream的collect實(shí)戰(zhàn)教程

    這篇文章主要介紹了java8新特性之stream的collect實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • mybatis實(shí)現(xiàn)特殊字段加密方式

    mybatis實(shí)現(xiàn)特殊字段加密方式

    這篇文章主要介紹了mybatis實(shí)現(xiàn)特殊字段加密,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Mybatis返回插入主鍵id的方法

    Mybatis返回插入主鍵id的方法

    這篇文章主要介紹了 Mybatis返回插入主鍵id的方法,在文章底部給大家補(bǔ)充了Mybatis中insert中返回主鍵ID的方法,非常不錯(cuò),需要的朋友可以參考下
    2017-04-04
  • 全面了解Java反射機(jī)制

    全面了解Java反射機(jī)制

    Java的反射機(jī)制在實(shí)踐中可謂無處不在,如果你已經(jīng)工作幾年,還對Java的反射機(jī)制一知半解,那么這篇文章絕對值得你讀一讀。
    2020-03-03
  • Java基于JDK 1.8的LinkedList源碼詳析

    Java基于JDK 1.8的LinkedList源碼詳析

    這篇文章主要給大家介紹了關(guān)于Java基于JDK 1.8的LinkedList源碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評論

聂拉木县| 磐石市| 东方市| 杭州市| 乳山市| 郯城县| 腾冲县| 泉州市| 保德县| 南宫市| 榆林市| 阿拉善右旗| 乌鲁木齐县| 静乐县| 安康市| 兰西县| 革吉县| 叙永县| 赤峰市| 乐业县| 白河县| 柳林县| 嵊泗县| 沁阳市| 安龙县| 嘉义县| 建宁县| 乃东县| 浦东新区| 浪卡子县| 东海县| 辉南县| 元江| 民丰县| 阿坝县| 久治县| 肥乡县| 巴楚县| 韶关市| 天镇县| 水城县|