SpringAMQPを使用したメッセージング
1. 概要
このチュートリアルでは、SpringAMQPフレームワークを使用したAMQPを介したメッセージベースの通信について説明します。 最初に、メッセージングの重要な概念のいくつかについて説明します。 次に、実際の例に移ります。
2. メッセージベースのコミュニケーション
メッセージングは、アプリケーション間で通信するための手法です。 同期要求応答ベースのアーキテクチャではなく、非同期メッセージパッシングに依存しています。 メッセージのプロデューサーとコンシューマーは、メッセージブローカーと呼ばれる中間メッセージングレイヤーによって分離されます。 メッセージブローカーは、メッセージの永続的な保存、メッセージフィルタリング、メッセージ変換などの機能を提供します。
Javaで記述されたアプリケーション間のメッセージングの場合、JMS(Java Message Service)APIが一般的に使用されます。
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-amqpとspring-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プロジェクトで入手できます。