SpringAMQPを使用したメッセージング

1。概要

このチュートリアルでは、SpringAMQPフレームワークを使用したAMQPを介したメッセージベースの通信について説明します。最初に、メッセージングの重要な概念のいくつかについて説明します。次に、実際の例に移ります。

2.メッセージベースのコミュニケーション

メッセージングは​​、アプリケーション間で通信するための手法です。同期要求応答ベースのアーキテクチャではなく、非同期メッセージパッシングに依存しています。メッセージのプロデューサーとコンシューマーは、メッセージブローカーと呼ばれる中間メッセージングレイヤーによって分離されています。メッセージブローカーは、メッセージの永続的な保存、メッセージフィルタリング、メッセージ変換などの機能を提供します。

Javaで記述されたアプリケーション間のメッセージングの場合、JMS(Java Message Service)APIが一般的に使用されます。異なるベンダーやプラットフォーム間の相互運用性のために、JMSクライアントとブローカーを使用することはできません。ここでAMQPが役に立ちます

3. AMQP –高度なメッセージキューイングプロトコル

AMQPは、非同期メッセージ通信用のオープンスタンダードのワイヤ仕様です。メッセージの作成方法について説明します。

3.1。AmqpとJmsの違い

AMQPはプラットフォームに依存しないバイナリプロトコル標準であるため、ライブラリはさまざまなプログラミング言語で記述でき、さまざまな環境で実行できます。

あるJMSブローカーから別のJMSブローカーに移行する場合のように、ベンダーベースのプロトコルロックインはありません。詳細については、JMSとAMQPおよびAMQPについてを参照してください。広く使用されているAMQPブローカーには、RabbitMQ OpenAMQ、およびStormMQがあります。

3.2。AMQPエンティティ

簡単に言うと、AMQPは、Exchange、キュー、およびバインディングで構成されています。

  • 取引所は郵便局やメールボックスのようなものであり、クライアントはAMQP取引所にメッセージを公開します。組み込みの交換タイプは4つあります
    • 直接交換–完全なルーティングキーを照合することにより、メッセージをキューにルーティングします
    • Fanout Exchange –それにバインドされているすべてのキューにメッセージをルーティングします
    • トピック交換–ルーティングキーをパターンに一致させることにより、メッセージを複数のキューにルーティングします
    • ヘッダー交換–メッセージヘッダーに基づいてメッセージをルーティングします
  • キューは、ルーティングキーを使用して交換にバインドされます
  • メッセージはルーティングキーを使用して取引所に送信されます。次に、エクスチェンジはメッセージのコピーをキューに配布します

詳細については、AMQPの概念とルーティングトポロジを参照してください。

3.3。春のAMQP

Spring AMQPは、spring-amqpspring-rabbitの2つのモジュールで構成されています。一緒に、これらのモジュールは以下の抽象化を提供します:

  • AMQPエンティティ– Message、Queue、Binding、およびExchangeクラスを使用してエンティティを作成します

  • 接続管理–CachingConnectionFactoryを使用してRabbitMQブローカーに接続します
  • メッセージの公開–RabbitTemplateを使用してメッセージを送信します
  • メッセージの消費– @ RabbitListenerを使用してキューからメッセージを読み取ります

4.Rabbitmqブローカーをセットアップします

接続できるRabbitMQブローカーが必要です。これを行う最も簡単な方法は、Dockerを使用してRabbitMQイメージをフェッチして実行することです。

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

アプリケーションがRabbitMQに接続できるように、ポート5672を公開します。

:そして、私たちは私たちのRabbitMQブローカが管理UIのいずれかを介して行っているものを見ることができるように、ポート15672を公開// localhostを:15672またはHTTP API://localhost:15672/api/index.html

5. SpringAmqpアプリケーションの作成

それでは、簡単な「Hello、world!」を送受信するアプリケーションを作成しましょう。SpringAMQPを使用したメッセージ。

5.1。Mavenの依存関係

追加するためには、バネAMQP春ウサギたちのプロジェクトにモジュールを、我々は追加のスプリングブート・スターター・AMQPの当社への依存度をのpom.xml

  org.springframework.boot spring-boot-starter-amqp 2.2.2.RELEASE  

最新バージョンはMavenCentralで見つけることができます。

5.2。Rabbitmqブローカーへの接続

私たちは、作成するために、春ブーツの自動構成を使用しますConnectionFactoryのRabbitTemplate、およびRabbitAdminの豆を。その結果、デフォルトのユーザー名とパスワード「guest」を使用して、ポート5672でRabbitMQブローカーに接続します。したがって、アプリケーションに@SpringBootApplicationアノテーションを付けるだけです

@SpringBootApplication public class HelloWorldMessageApp { // ... }

5.3。キューを作成する

キューを作成するには、QueueタイプのBeanを定義するだけです。RabbitAdminはこれを見つけ、「myQueue」のルーティングキーを使用してデフォルトの取引所にバインドします。

@Bean public Queue myQueue() { return new Queue("myQueue", false); }

RabbitMQが停止したときにキューとその上のメッセージが削除されるように、キューを非永続的に設定しました。ただし、アプリケーションを再起動してもキューには影響しないことに注意してください。

5.4。私たちのメッセージを送る

RabbitTemplate使用して、「Hello、world!」を送信しましょう。メッセージ:

rabbitTemplate.convertAndSend("myQueue", "Hello, world!");

5.5。私たちのメッセージを消費する

@RabbitListenerでメソッドにアノテーションを付けることにより、メッセージコンシューマーを実装します。

@RabbitListener(queues = "myQueue") public void listen(String in) { System.out.println("Message read from myQueue : " + in); }

6.アプリケーションの実行

まず、RabbitMQブローカーを起動します。

docker run -d -p 5672:5672 -p 15672:15672 --name my-rabbit rabbitmq:3-management

次に、HelloWorldMessage.javaを実行し、main()メソッドを実行して、SpringBootアプリケーションを実行します。

mvn spring-boot:run -Dstart-class=com.baeldung.springamqp.simple.HelloWorldMessageApp

アプリケーションの実行中に、次のことがわかります。

  • アプリケーションは、ルーティングキーとして「myQueue」を使用してデフォルトの取引所にメッセージを送信します
  • 次に、キュー「myQueue」がメッセージを受信します
  • 最後に、listenメソッドは「myQueue」からのメッセージを消費してコンソールに出力します

// localhost:15672のRabbitMQ管理ページを使用して、メッセージが送信および消費されたことを確認することもできます。

7.結論

このチュートリアルでは、アプリケーション間の通信にSpringAMQPを使用したAMQPプロトコルを介したメッセージングベースのアーキテクチャについて説明しました。

このチュートリアルの完全なソースコードとすべてのコードスニペットは、GitHubプロジェクトで入手できます。