目次
1. 使用シナリオ
2. 実際の戦闘への返信
(1) 依存関係と YML 構成
(2 ) の対話メソッドであるため、その他の特別な構成はありません。 Bean 設定
(3) メッセージ生成側
(4) メッセージ利用者側
(1) メソッド1: sendTo アノテーション メソッドの戻り値
(2) 方法 2 : 制作側からのメッセージを読み取り、テンプレート
このメソッドは実際には 1 と一致しますが、プロデューサーのメッセージが ReplyTo のアドレスなしで指定しているため、テストしました。コンシューマは、それを手動で再度指定する必要はありません。つまり、メッセージを生成する場所、応答するかどうか、および応答メッセージをどこに送信するかはすべて、プロデューサ自体に任されています。コンシューマは、独自のビジネスを処理して結果を返すだけで済みます。
ホームページ Java &#&チュートリアル springboot Rabbitmq 応答メッセージの直接応答モードを実装する方法

springboot Rabbitmq 応答メッセージの直接応答モードを実装する方法

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

1. 使用シナリオ

MQ の機能には、デカップリング、非同期などが含まれます。

通常、プロデューサーはメッセージを作成することのみを担当し、誰がメッセージを取得するか、または消費結果が何であるかは気にしません。コンシューマーは、ビジネス処理のために指定されたメッセージを受信することのみを担当し、メッセージがどこに送信されるかは気にしません。 from、第 1 レベルの応答ビジネス処理条件。しかし、私たちのプロジェクトには特別なビジネスがあり、メッセージプロデューサーとして、メッセージを生成した後にコンシューマーの応答結果を受け取る必要があります (率直に言うと、これは同期呼び出し要求応答を MQ で使用するのと似ています)。調査によると、MQ の返信モード (直接返信モデル) は、このビジネス モデル用に作成されました。

2. 実際の戦闘への返信

(1) 依存関係と YML 構成

Dependency:

ここではコアのみをリストします。 RabbitMq に必要な依存関係

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
ログイン後にコピー

構成:

応答は Rabbitmq

spring:
  rabbitmq:
    host: 10.50.40.116
    port: 5673
    username: admin
    password: admin
ログイン後にコピー

(2 ) の対話メソッドであるため、その他の特別な構成はありません。 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. メッセージ消費後の応答のキューを指定します (返信)

    /**
     * 生产消息
     *
     * @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) Accept 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) メソッド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) 方法 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) メソッド 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 応答メッセージの直接応答モードを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

React と RabbitMQ を使用して信頼性の高いメッセージング アプリを構築する方法 React と RabbitMQ を使用して信頼性の高いメッセージング アプリを構築する方法 Sep 28, 2023 pm 08:24 PM

React と RabbitMQ を使用して信頼性の高いメッセージング アプリケーションを構築する方法 はじめに: 最新のアプリケーションは、リアルタイム更新やデータ同期などの機能を実現するために、信頼性の高いメッセージングをサポートする必要があります。 React はユーザー インターフェイスを構築するための人気のある JavaScript ライブラリであり、RabbitMQ は信頼性の高いメッセージング ミドルウェアです。この記事では、React と RabbitMQ を組み合わせて信頼性の高いメッセージング アプリケーションを構築する方法を紹介し、具体的なコード例を示します。 RabbitMQ の概要:

RabbitMQ を使用して PHP で分散メッセージ処理を実装する方法 RabbitMQ を使用して PHP で分散メッセージ処理を実装する方法 Jul 18, 2023 am 11:00 AM

RabbitMQ を使用して PHP で分散メッセージ処理を実装する方法 はじめに: 大規模なアプリケーション開発では、分散システムが一般的な要件になっています。分散メッセージ処理は、タスクを複数の処理ノードに分散することでシステムの効率と信頼性を向上させるパターンです。 RabbitMQ は、AMQP プロトコルを使用してメッセージの配信と処理を実装する、オープンソースの信頼性の高いメッセージ キュー システムです。この記事では、配布のために PHP で RabbitMQ を使用する方法について説明します。

SpringBootとSpringMVCの比較と差異分析 SpringBootとSpringMVCの比較と差異分析 Dec 29, 2023 am 11:02 AM

SpringBoot と SpringMVC はどちらも Java 開発で一般的に使用されるフレームワークですが、それらの間には明らかな違いがいくつかあります。この記事では、これら 2 つのフレームワークの機能と使用法を調べ、その違いを比較します。まず、SpringBoot について学びましょう。 SpringBoot は、Spring フレームワークに基づいたアプリケーションの作成と展開を簡素化するために、Pivo​​tal チームによって開発されました。スタンドアロンの実行可能ファイルを構築するための高速かつ軽量な方法を提供します。

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 に基づくリアルタイム データ同期ソリューションを紹介し、具体的なコード例を示します。 1. RabbitMQ とは何ですか?ラビ

go-zeroとRabbitMQの応用実践 go-zeroとRabbitMQの応用実践 Jun 23, 2023 pm 12:54 PM

現在、マイクロサービス アーキテクチャ モデルを採用する企業が増えており、このアーキテクチャではメッセージ キューが重要な通信手段となっており、その中でも RabbitMQ が広く使用されています。 Go 言語では、go-zero は近年登場したフレームワークであり、開発者がメッセージ キューをより簡単に使用できるようにするための実用的なツールやメソッドが数多く提供されています。以下では、実際のアプリケーションに基づいて go-zero を紹介します。とRabbitMQの応用実践。 1.RabbitMQ の概要Rabbit

Golang RabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装 Golang RabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装 Sep 28, 2023 am 08:18 AM

GolangRabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装には、特定のコード サンプルが必要です はじめに: インターネット技術の継続的な開発とその広範な応用により、メッセージ キューは現代のソフトウェア システムに不可欠な部分になりました。メッセージ キューは、デカップリング、非同期通信、フォールト トレラント処理、その他の機能を実装するツールとして、分散システムに高可用性とスケーラビリティのサポートを提供します。 Golang は効率的で簡潔なプログラミング言語として、同時実行性とパフォーマンスの高いシステムを構築するために広く使用されています。

See all articles