SpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法
環境構成
SpringBoot
Integration RabbitMQ
はメッセージの送信を実現します。
1. maven
依存関係を追加します
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
2. application.yml 設定ファイルを追加します
spring: rabbitmq: host: 192.168.3.19 port: 5672 username: admin password: xxxx
3. スイッチ、キュー、バインディングを設定します
@Bean public DirectExchange myExchange() { DirectExchange directExchange = new DirectExchange("myExchange"); return directExchange; } @Bean public Queue myQueue() { Queue queue = new Queue("myQueue"); return queue; } @Bean public Binding binding() { return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey"); }
4. プロダクションはメッセージを送信します
@Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/send") public String send(String message) { rabbitTemplate.convertAndSend("myExchange","myRoutingKey",message); System.out.println("【发送消息】" + message) return "【send message】" + message; }
5. コンシューマはメッセージを受信します
@RabbitListener(queuesToDeclare = @Queue("myQueue")) public void process(String msg, Channel channel, Message message) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String time = sdf.format(date); System.out.println("【接收信息】" + msg + " 当前时间" + time);
6. プロダクション側を呼び出してメッセージを送信します hello
、コンソール出力:
#[メッセージ送信] helloメッセージが正常に受信されたことを示します。 メッセージ損失分析[メッセージ受信] hello 現在時刻 2022-05-12 10:21:14
- #プロダクション側で失われた: プロデューサーは
- RabbitMQ
- RabbitMQ
ストレージ自体はdown
#消費者側で紛失: ネットワークの問題により、ストレージを消費者側に送信できないか、消費がハングして通常の消費を送信できません - RabbitMQ
実稼働フェーズ
リクエスト確認メカニズム
を使用して、メッセージの信頼性の高い送信を保証します。 RabbitMQ サーバーにメッセージを送信した後、RabbitMQ はメッセージを受信し、RabbitMQ サーバーがメッセージを正常に受信したことを示す要求確認を送信者に返します。Configuration application.yml
spring: rabbitmq: # 消息确认机制 生产者 -> 交换机 publisher-confirms: true # 消息返回机制 交换机 -> 队列 publisher-returns: true
@Configuration @Slf4j public class RabbitConfig { @Autowired private ConnectionFactory connectionFactory; @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { log.info("【correlationData】:" + correlationData); log.info("【ack】" + ack); log.info("【cause】" + cause); if (ack) { log.info("【发送成功】"); } else { log.info("【发送失败】correlationData:" + correlationData + " cause:" + cause); } } }); rabbitTemplate.setMandatory(true); rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() { @Override public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { log.warn("【消息发送失败】"); log.info("【message】" + message); log.info("【replyCode】" + replyCode); } }); return rabbitTemplate; } }
Producer
からswitch へのメッセージ、confirmCallback# があります## モードを確認します。メッセージが正常に送信された後、メッセージはメソッド confirm(CorrelationData correlationData, boolean ack, String Cause) を呼び出し、ack
に基づいてメッセージが正常に送信されたかどうかを判断します。 switch
から queue
へのメッセージには
リターン モードがあります。 メッセージの送信 製品メッセージ コンソール出力は次のとおりです:
[メッセージの受信]製品メッセージ 現在時刻 2022 -05 -12 11:27:56[correlationData]:null
[ack]true
[送信成功]
生産終了シミュレーション メッセージが失われます
ここには 2 つの解決策があります:
メッセージを送信した直後にブローカーを閉じます。後者はネットワークをシャットダウンしますが、ブローカーが閉じられた後です。 、コンソールは常にエラーを報告し、メッセージを送信します。また、500 エラーも報告します。
- 存在しないスイッチを送信:
// myExchange 修改成 myExchangexxxxx rabbitTemplate.convertAndSend("myExchangexxxxx","myRoutingKey",message);
ログイン後にコピー 結果: - [correlationData]:null 【ack】false
[送信に失敗しました]
[correlationData]:CorrelationData [id=7d468b47-b422-4523-b2a2] -06b14aef073c]送信が失敗した場合は、メッセージを再試行できます
スイッチはメッセージを受信し、成功通知を返します。コンソール出力:
スイッチは正しく、キューは送信に失敗しました。存在しないというメッセージが送信されます:
[ack ]true
[cause]null[送信成功]
[返信コード]312スイッチはキューを見つけられず、障害情報を返しました:
[メッセージ]製品メッセージ
[メッセージの送信に失敗しました]
RabbitMQメッセージがキュー。まず、キューとスイッチを正しく設定し、
キューの永続性を有効にし、キューとスイッチを作成します
デフォルト設定は永続性です
に格納されるように消費監視用のキューを変更します。
キューの永続性を非永続性に変更します: @Bean
public Queue myQueue() {
Queue queue = new Queue("myQueue",false);
return queue;
}
@Bean public Queue myQueue() { Queue queue = new Queue("myQueue",true); return queue; }
コンシューマ エンド
コンシューマ エンドはデフォルトで開始されます
自動確認モードキュー メッセージがコンシューマによって受信されると、メッセージは関係なくキューから自動的に削除されます消費者側からのメッセージがあるかどうかのニュース。したがって、コンシューマーがメッセージを正常に消費できることを確認するには、自動モードを手動確認モードに変更します。
application.yml ファイルを変更します
spring: rabbitmq: # 手动消息确认 listener: simple: acknowledge-mode: manual
メッセージを消費して受信した後、手動による確認が必要です: <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="contentsignin">ログイン後にコピー</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'> @RabbitListener(queuesToDeclare = @Queue("myQueue"))
public void process(String msg, Channel channel, Message message) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String time = sdf.format(date);
System.out.println("【接收信息】" + msg + " 当前时间" + time);
System.out.println(message.getMessageProperties().getDeliveryTag());
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (IOException e) {
e.printStackTrace();
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
追加しない場合:
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
2 つのメッセージを送信します
メッセージを受信した後、確認は行われず、キューに戻されます:
プロジェクトを再起動します。その後、キュー内のメッセージはコンシューマに送信されますが、ACK 確認がなければ、キューに戻され続けます。 。channel.basicAck を追加した後、プロジェクトを再起動します
basicAck メソッド
multiple の最後のパラメータは、前のキューを削除することを意味します。
multiple は
true に設定され、後続のキューはすべてクリアされます
以上がSpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

最新のアプリケーションが複雑になるにつれて、メッセージングは強力なツールになっています。この分野では、RabbitMQ は、異なるアプリケーション間でメッセージを配信するために使用できるメッセージ ブローカーとして非常に人気があります。この記事では、Go 言語で RabbitMQ を使用する方法を説明します。このガイドでは以下の内容について説明します: RabbitMQ の概要 RabbitMQ のインストール RabbitMQ の基本概念 Go で RabbitMQ を使用する入門 RabbitMQ と Go

この記事では、dubbo+nacos+Spring Boot の実際の開発について詳しく説明する例を書きます。この記事では理論的な知識はあまり取り上げませんが、dubbo を nacos と統合して開発環境を迅速に構築する方法を説明する最も簡単な例を書きます。

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

Golang と RabbitMQ 間のリアルタイム データ同期ソリューションの紹介: 今日の時代では、インターネットの普及とデータ量の爆発的な増加に伴い、リアルタイム データ同期の重要性がますます高まっています。非同期データ送信とデータ同期の問題を解決するために、多くの企業はメッセージ キューを使用してデータのリアルタイム同期を実現し始めています。この記事では、Golang と RabbitMQ に基づくリアルタイム データ同期ソリューションを紹介し、具体的なコード例を示します。 1. RabbitMQ とは何ですか?ラビ

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