目錄
一、使用場景
二、Reply實戰
(1)依賴與YML配置
這種方式與1其實是一致的,但我經過測試,因為生產者訊息指定了ReplyTo的地址,消費者端無需自己再次手動指定,即生產消息到哪裡,是否響應以及響應消息發送到哪裡全由生產端自己空,消費者只需要處理自身業務以及返回結果
首頁 Java java教程 springboot rabbitmq reply訊息直接回覆模式怎麼實現

springboot rabbitmq reply訊息直接回覆模式怎麼實現

May 11, 2023 am 11:58 AM
springboot rabbitmq reply

一、使用場景

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

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

二、Reply實戰

(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");
    }
}
登入後複製

業務類別:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Vehicle implements Serializable {
    private Integer id;
    private String name;
}
登入後複製

(3)訊息生產端

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

(1)生產訊息

  • #1、生產訊息,看業務場景選擇是否產生全域唯一自訂的訊息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 根据业务,做一个严谨的全局唯一ID,我这里暂时用UUID
            String correlationId = UUID.randomUUID().toString();
            // 我这里指定了唯一消息ID,看业务场景,消费者消费响应后,生产者端可根据消息ID做业务处理
            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("生产者发送消息,自定义消息ID为:" + correlationId);
        }
    登入後複製

(2)接受Reply回應

消費者消費訊息後會將處理結果傳送到一個佇列,我們讀取這裡佇列就可以拿到對應訊息的回應結果進行業務處理了

    /**
     * 接收消息响应
     *
     * @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可判断这是哪一个消息的响应,我们就可做业务操作
        System.out.println("收到客户端响应消息:" + s);
    }
登入後複製

(4)訊息消費端

訊息消費端需要做的事有:接受訊息然後進行業務處理、回應訊息

(1)方法一:sendTo註解方法傳回值
一般來說,我們mq消費者監聽方法不需要回傳值,我們這裡使用sendTo註解,則需要將要回應的訊息定義為回傳值,sendTo註解中指定要回應到哪個佇列

重點:

  • 1、sendTo註解指定要對應的佇列(注意和生產端保持一致)

  • 2、方法定義的回傳值內容就是要回應的訊息,最後會傳送到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("处理业务消息失败",e);
            }
            return null;
        }
    登入後複製
(2)方法二:讀取生產端的訊息使用範本發送
與普通的消費者方法一樣,只需要RabbitListener註解監聽業務佇列;但還需要根據訊息取得ReplyTo位址,然後自己消費者方法內部手動傳送訊息

  • 1、優點,更強烈的感受到訊息請求回應的互動性,流程看起來更清晰

  • ##2、缺點,程式碼不雅
  •     /**
         * 方式2  message消息获取内部reply rabbitmq手动发送
         *
         * @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("处理业务消息失败",e);
            }
        }
    登入後複製
  • (3)方法三:方法傳回值
這種方式與1其實是一致的,但我經過測試,因為生產者訊息指定了ReplyTo的地址,消費者端無需自己再次手動指定,即生產消息到哪裡,是否響應以及響應消息發送到哪裡全由生產端自己空,消費者只需要處理自身業務以及返回結果
   /**
     * 方式三  方法有返回值,返回要响应的数据 (reply 由生产者发送消息时指定,消费者不做任何处理)
     *
     * @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("处理业务消息失败",e);
        }
        return null;
    }
登入後複製

(4)測試

生產訊息:

springboot rabbitmq reply消息直接回复模式怎么实现

消費訊息與回應:

springboot rabbitmq reply消息直接回复模式怎么实现

springboot rabbitmq reply消息直接回复模式怎么实现

springboot rabbitmq reply消息直接回复模式怎么实现

############## ###############收到的回應:#####################連結:####### ##########

以上是springboot rabbitmq reply訊息直接回覆模式怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何利用React和RabbitMQ建立可靠的訊息應用 如何利用React和RabbitMQ建立可靠的訊息應用 Sep 28, 2023 pm 08:24 PM

如何利用React和RabbitMQ建立可靠的訊息傳遞應用程式引言:現代化的應用程式需要支援可靠的訊息傳遞,以實現即時更新和資料同步等功能。 React是一種流行的JavaScript庫,用於建立使用者介面,而RabbitMQ是一種可靠的訊息傳遞中間件。本文將介紹如何結合React和RabbitMQ建立可靠的訊息傳遞應用,並提供具體的程式碼範例。 RabbitMQ概述:

如何在PHP中使用RabbitMQ實現分散式訊息處理 如何在PHP中使用RabbitMQ實現分散式訊息處理 Jul 18, 2023 am 11:00 AM

如何在PHP中使用RabbitMQ實現分散式訊息處理引言:在大規模應用程式開發中,分散式系統已成為一個常見的需求。分散式訊息處理是這樣的一種模式,透過將任務分發到多個處理節點,可以提高系統的效率和可靠性。 RabbitMQ是一個開源的,可靠的訊息佇列系統,它採用AMQP協定來實現訊息的傳遞和處理。在本文中,我們將介紹如何在PHP中使用RabbitMQ來實現分佈

SpringBoot與SpringMVC的比較及差別分析 SpringBoot與SpringMVC的比較及差別分析 Dec 29, 2023 am 11:02 AM

SpringBoot和SpringMVC都是Java開發中常用的框架,但它們之間有一些明顯的差異。本文將探究這兩個框架的特點和用途,並對它們的差異進行比較。首先,我們來了解一下SpringBoot。 SpringBoot是由Pivotal團隊開發的,它旨在簡化基於Spring框架的應用程式的建立和部署。它提供了一種快速、輕量級的方式來建立獨立的、可執行

在Go語言中使用RabbitMQ:完整指南 在Go語言中使用RabbitMQ:完整指南 Jun 19, 2023 am 08:10 AM

隨著現代應用程式的複雜性增加,訊息傳遞已成為一種強大的工具。在這個領域,RabbitMQ已成為一個非常受歡迎的訊息代理,可以用於在不同的應用程式之間傳遞訊息。在這篇文章中,我們將探討如何在Go語言中使用RabbitMQ。本指南將涵蓋以下內容:RabbitMQ簡介RabbitMQ安裝RabbitMQ基礎概念Go語言中的RabbitMQ入門RabbitMQ和Go

SpringBoot+Dubbo+Nacos 開發實戰教程 SpringBoot+Dubbo+Nacos 開發實戰教程 Aug 15, 2023 pm 04:49 PM

本文來寫個詳細的例子來說下dubbo+nacos+Spring Boot開發實戰。本文不會講述太多的理論的知識,會寫一個最簡單的例子來說明dubbo如何與nacos整合,快速建構開發環境。

Golang與RabbitMQ實現即時資料同步的解決方案 Golang與RabbitMQ實現即時資料同步的解決方案 Sep 27, 2023 pm 10:41 PM

Golang與RabbitMQ實現即時數據同步的解決方案引言:當今時代,隨著互聯網的普及和數據量的爆發式增長,即時數據的同步變得越來越重要。為了解決資料非同步傳輸和資料同步的問題,許多公司開始採用訊息佇列的方式來實現資料的即時同步。本文將介紹基於Golang和RabbitMQ的即時資料同步的解決方案,並提供具體的程式碼範例。一、什麼是RabbitMQ? Rabbi

go-zero與RabbitMQ的應用實踐 go-zero與RabbitMQ的應用實踐 Jun 23, 2023 pm 12:54 PM

現在越來越多的企業開始採用微服務架構模式,而在這個架構中,訊息佇列成為一種重要的通訊方式,其中RabbitMQ被廣泛應用。而在go語言中,go-zero是近年來崛起的一種框架,它提供了許多實用的工具和方法,讓開發者更輕鬆地使用訊息佇列,下面我們將結合實際應用,來介紹go-zero和RabbitMQ的使用方法和應用實務。 1.RabbitMQ概述Rabbit

Swoole與RabbitMQ整合實務:打造高可用性訊息佇列系統 Swoole與RabbitMQ整合實務:打造高可用性訊息佇列系統 Jun 14, 2023 pm 12:56 PM

隨著網路時代的到來,訊息佇列系統變得越來越重要。它可以使不同的應用之間實現非同步操作、降低耦合度、提高可擴展性,進而提升整個系統的效能和使用者體驗。在訊息佇列系統中,RabbitMQ是一個強大的開源訊息佇列軟體,它支援多種訊息協定、被廣泛應用於金融交易、電子商務、線上遊戲等領域。在實際應用中,往往需要將RabbitMQ和其他系統整合。本文將介紹如何使用sw

See all articles