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

springboot-rabbitmq-reply?消息直接回復模式詳情

 更新時間:2022年09月20日 16:57:36   作者:保護我方胖虎  
這篇文章主要介紹了springboot-rabbitmq-reply消息直接回復模式詳情,文章通過圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下

一、使用場景

MQ的作用包括了解耦、異步等。

通常生產者只負責生產消息,而不關心消息誰去獲取,或者消費結果如何;消費者只負責接收指定的消息進行業(yè)務處理而不關心消息從哪里來一級回復業(yè)務處理情況。但我們項目中有特殊的業(yè)務存在,我們作為消息生產者在生產消息后需要接收消費者的響應結果(說白了就是類似同步調用 請求響應的MQ使用),經過研究,MQ的Reply模式(直接回復模式)就是為此種業(yè)務模式而產生。

二、Reply實戰(zhàn)

(1)依賴與YML配置

依賴:

我這里只列出最核心的rabbitMq所需依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

配置:

無其余特殊配置,因為reply就是rabbitmq的一種交互方式而已

spring:
  rabbitmq:
    host: 10.50.40.116
    port: 5673
    username: admin
    password: admin

(2)RabbitMq bean配置

package com.leilei.demo;

import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author lei
 * @create 2022-09-19 21:44
 * @desc mq配置
 **/
@Configuration
public class RabbitMqConfig {
    @Bean
    public Queue bizQueue() {
        return new Queue("bizQueue");
    }
    @Bean
    public Queue replyQueue() {
        return new Queue("replyQueue");
    }
    @Bean
    FanoutExchange bizExchange() {
        return new FanoutExchange("bizExchange");
    }
}

業(yè)務類:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Vehicle implements Serializable {
    private Integer id;
    private String name;
}

(3)消息生產端

消息生產端需要做的事情:有生產消息、接受消息消費響應

(1)生產消息

  • 1、生產消息,看業(yè)務場景選擇是否生成全局唯一自定義的消息ID
  • 2、指定消息消費后響應的隊列(Reply)
    /**
     * 生產消息
     *
     * @param
     * @return void
     * @author lei
     * @date 2022-09-19 21:59:18
     */
    public void replySend() {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setReplyTo("replyQueue");
        //todo 根據業(yè)務,做一個嚴謹的全局唯一ID,我這里暫時用UUID
        String correlationId = UUID.randomUUID().toString();
        // 我這里指定了唯一消息ID,看業(yè)務場景,消費者消費響應后,生產者端可根據消息ID做業(yè)務處理
        messageProperties.setCorrelationId(correlationId);
        Vehicle vehicle = new Vehicle(1, "川A0001");
        Message message = new Message(JSON.toJSONString(vehicle).getBytes(), messageProperties);
        rabbitTemplate.convertAndSend("bizExchange","",message);
        System.out.println("生產者發(fā)送消息,自定義消息ID為:" + correlationId);
    }

(2)接受Reply響應

消費者消費消息后會將處理結果進行發(fā)送到一個隊列,我們讀取這里隊列就可以拿到對應消息的響應結果進行業(yè)務處理了

    /**
     * 接收消息響應
     *
     * @param message
     * @return void
     * @author lei
     * @date 2022-09-19 21:59:27
     */
    @RabbitListener(queues = "replyQueue")
    public void replyResponse(Message message) {
        String s = new String(message.getBody());
        String correlationId = message.getMessageProperties().getCorrelationId();
        System.out.println("收到客戶端響應消息ID:" + correlationId);
        //todo 根據消息ID可判斷這是哪一個消息的響應,我們就可做業(yè)務操作
        System.out.println("收到客戶端響應消息:" + s);
    }

(4)消息消費端

消息消費端需要做的事有:接受消息然后進行業(yè)務處理、響應消息

(1)方法一:sendTo注解+方法返回值

一般來說,我們mq消費者監(jiān)聽方法不需要返回值,我們這里使用sendTo注解,則需要將要響應的消息定義為返回值,sendTo注解中指定要響應到哪個隊列

重點:

  • 1、sendTo注解指定要相應的隊列(注意和生產端保持一致)
  • 2、方法定義的返回值內容就是要響應的消息,最終會發(fā)送到sendTo注解指定要相應的隊列
  • 3、這種方法的缺點是消費端的主關性很高,因為sendTo指定的目標隊列可以自己瞎寫,導致生產者端無法正確收到消息響應,但我相信一般項目中也不會這么干
    /**
     * 方式1   SendTo指定響應隊列
     *
     * @param message
     * @return String
     * @author lei
     * @date 2022-09-19 16:17:52
     */
    @RabbitListener(queues ="bizQueue")
    @SendTo("replyQueue")
    public String handleEmailMessage(Message message) {
        try {
            String msg=new String(message.getBody(), StandardCharsets.UTF_8);
            log.info("---consumer接收到消息----{}",msg);
            return "客戶端響應消息:"+msg+"處理完成!";
        } catch (Exception e) {
            log.error("處理業(yè)務消息失敗",e);
        }
        return null;
    }

(2)方法二:讀取生產端的消息使用模板發(fā)送

與普通的消費者方法一樣,只需要RabbitListener注解監(jiān)聽業(yè)務隊列;但還需要根據消息獲取出ReplyTo地址,然后自己消費者方法內部手動發(fā)送消息

  • 1、優(yōu)點,更強烈的感受到消息請求 響應的交互性,流程看起來更清晰
  • 2、缺點,代碼不雅
    /**
     * 方式2  message消息獲取內部reply rabbitmq手動發(fā)送
     *
     * @param message
     * @return String
     * @author lei
     * @date 2022-09-19 16:17:52
     */
    @RabbitListener(queues = "bizQueue")
    public void handleEmailMessage2(Message message) {
        try {
            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
            log.info("---consumer接收到消息----{}", msg);
            String replyTo = message.getMessageProperties().getReplyTo();
            System.out.println("接收到的reply:" + replyTo);
            rabbitTemplate.convertAndSend(replyTo, "客戶端響應消息:" + msg + "處理完成!", x -> {
                x.getMessageProperties().setCorrelationId(message.getMessageProperties().getCorrelationId());
                return x;
            });
        } catch (Exception e) {
            log.error("處理業(yè)務消息失敗",e);
        }
    }

(3)方法三:方法返回值

這種方式與1其實是一致的,但我經過測試,因為生產者消息指定了ReplyTo的地址,消費者端無需自己再次手動指定,即生產消息到哪里,是否響應以及響應消息發(fā)送到哪里全由生產端自己空,消費者只需要處理自身業(yè)務以及返回結果

   /**
     * 方式三  方法有返回值,返回要響應的數據 (reply 由生產者發(fā)送消息時指定,消費者不做任何處理)
     *
     * @param message
     * @return String
     * @author lei
     * @date 2022-09-19 23:17:47
     */
    @RabbitListener(queues ="bizQueue")
    public String handleEmailMessage3(Message message) {
        try {
            String msg=new String(message.getBody(), StandardCharsets.UTF_8);
            log.info("---consumer接收到消息----{}",msg);
            return "客戶端響應消息:"+msg+"處理完成!";
        }
        catch (Exception e) {
            log.error("處理業(yè)務消息失敗",e);
        }
        return null;
    }

(4)測試

生產消息:

消費消息與響應:

收到的響應:

鏈路:

如此,MQ版本的請求響應模式就完成了,其實很多大佬使用MQ來實現(xiàn)RPC就是用的ReplyTo啦!

到此這篇關于springboot-rabbitmq-reply 消息直接回復模式詳情的文章就介紹到這了,更多相關springboot-rabbitmq-reply 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用Backoff策略提高HttpClient連接管理的效率

    使用Backoff策略提高HttpClient連接管理的效率

    這篇文章主要為大家介紹了Backoff策略提高HttpClient連接管理的效率使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 如何解決@NotBlank不生效的問題

    如何解決@NotBlank不生效的問題

    這篇文章主要介紹了如何解決@NotBlank不生效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java Spring中Quartz調度器詳解及實例

    Java Spring中Quartz調度器詳解及實例

    這篇文章主要介紹了Java Spring中Quartz調度器詳解及實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • 詳解Java的面向對象和面向過程

    詳解Java的面向對象和面向過程

    我們知道,Java是面向對象的編程語言,但是至今仍有不少同學還不太懂”面向對象“的確切含義,今天這篇文章就帶大家真正地認識面向對象,感興趣的同學可以跟著小編一起來學習
    2023-05-05
  • SpringBoot配置文件密碼加密與解密的操作代碼

    SpringBoot配置文件密碼加密與解密的操作代碼

    我們在SpringBoot項目當中,會把數據庫的用戶名密碼等配置直接放在yaml或者properties文件中,這樣維護數據庫的密碼等敏感信息顯然是有一定風險的,所以我們需要給密碼加解密,本文給大家介紹了SpringBoot配置文件密碼加密與解密的操作代碼,需要的朋友可以參考下
    2024-12-12
  • Springboot 使用 JSR 303 對 Controller 控制層校驗及 Service 服務層 AOP 校驗 使用消息資源文件對消息國際化

    Springboot 使用 JSR 303 對 Controller 控制層校驗及 Service 服務層 AOP 校驗

    這篇文章主要介紹了Springboot 使用 JSR 303 對 Controller 控制層校驗及 Service 服務層 AOP 校驗 使用消息資源文件對消息國際化的相關知識,需要的朋友可以參考下
    2017-12-12
  • 詳解Java如何實現(xiàn)基于Redis的分布式鎖

    詳解Java如何實現(xiàn)基于Redis的分布式鎖

    在不同進程需要互斥地訪問共享資源時,分布式鎖是一種非常有用的技術手段。這篇文章運用圖文和實例代碼介紹了Java如何實現(xiàn)基于Redis的分布式鎖,文章介紹的很詳細,對Java和Redis剛興趣的朋友們可以參考借鑒,下面來一起看看。
    2016-08-08
  • SpringCloud-Hystrix組件使用方法

    SpringCloud-Hystrix組件使用方法

    這篇文章主要介紹了SpringCloud-Hystrix組件使用方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java數據結構之圖的基礎概念和數據模型詳解

    Java數據結構之圖的基礎概念和數據模型詳解

    在現(xiàn)實生活中,有許多應用場景會包含很多點以及點點之間的連接,而這些應用場景我們都可以用即將要學習的圖這種數據結構去解決。本文主要介紹了圖的基礎概念和數據模型,感興趣的可以了解一下
    2022-11-11
  • 解決SpringBoot請求返回字符串中文亂碼的問題

    解決SpringBoot請求返回字符串中文亂碼的問題

    這篇文章主要介紹了解決SpringBoot請求返回字符串中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評論

青河县| 六盘水市| 湘阴县| 璧山县| 普宁市| 醴陵市| 平山县| 永昌县| 新巴尔虎右旗| 腾冲县| 漯河市| 靖宇县| 霍州市| 广灵县| 腾冲县| 建昌县| 普宁市| 西林县| 贺州市| 林甸县| 苍南县| 田东县| 靖宇县| 沁源县| 青河县| 贵港市| 明水县| 内丘县| 阿拉尔市| 吕梁市| 嘉义市| 健康| 聂拉木县| 卓尼县| 连平县| 绥中县| 奉节县| 西藏| 鄱阳县| 茂名市| 凤庆县|