1. 概要

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

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

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

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

3. AMQP – Advanced Message Queuing Protocol

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

3.1. AmqpとJmsの違い

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

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

3.2. AMQPエンティティ

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

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

詳細については、 AMQPConceptsおよびRoutingTopologiesをご覧ください。

3.3. 春のAMQP

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

  • AMQPエンティティ– メッセージ、キュー、バインディング、および交換クラスを使用してエンティティを作成します
  • 接続管理– 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を公開します。

また、ポート15672を公開して、RabbitMQブローカーが管理UI: http:// localhost:15672またはHTTPAPI: http:// localhost:のいずれかを介して実行していることを確認できるようにします。 15672 / api /index.html

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

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

5.1. Mavenの依存関係

spring-amqpおよびspring-rabbitモジュールをプロジェクトに追加するために、spring-boot-starter-amqp依存関係をに追加します。 ] pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
</dependencies>

最新バージョンはMavenCentralにあります。

5.2. Rabbitmqブローカーに接続する

Spring Bootの自動構成を使用して、ConnectionFactory、RabbitTemplate、およびRabbitAdminBeanを作成します。 その結果、デフォルトのユーザー名とパスワード「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()メソッドを実行して、スプリングブートアプリケーションを実行します。

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

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

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

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

7. 結論

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

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