1概要
この記事では、Spring AMQPフレームワークを使用したAMQPプロトコルを介したメッセージングベースの通信について説明します。まず、メッセージングの重要な概念をいくつか説明し、次に5章の実用的な例に進みます。
1.1. Mavenの依存関係
プロジェクトで spring-amqp と spring-rabbit を使用するには、以下の依存関係を追加するだけです。
<dependencies>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>1.6.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.6.6.RELEASE</version>
</dependency>
</dependencies>
最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7C(g%3A%22org.springframework.amqp%22%20AND%20a%3A%22spring-amqpにあります。 %22)%20OR%20(g%3A%22org.springframework.amqp%22%20AND%20a%3A%22spring-rabbit%22)[Mavenリポジトリ]。
** 2メッセージングベースのコミュニケーション____
__ **
メッセージングは、同期要求応答ベースのアーキテクチャではなく非同期メッセージの受け渡しに依存するアプリケーション間通信のための技法です。メッセージのプロデューサとコンシューマは、メッセージブローカとして知られる中間メッセージングレイヤによって分離されています。メッセージブローカーは、メッセージの永続的な保存、メッセージのフィルタリング、メッセージの変換などの機能を提供します。
Javaで書かれたアプリケーション間の相互通信の場合、JMS(Java Message Service)APIはメッセージの送受信に一般的に使用されます。さまざまなベンダーやプラットフォーム間の相互運用性のために、JMSクライアントとブローカーを使用することはできません。これがAMQPが役に立つところです。
** 3 AMQP - アドバンストメッセージキュープロトコル____
__ **
AMQPは、非同期メッセージングベースの通信用のオープンスタンダードのワイヤ仕様です。メッセージの構成方法についての説明があります。送信データの1バイトごとに指定します。
3.1. AMQPとJMS の違い
AMQPはプラットフォームに依存しないバイナリプロトコル規格なので、この特性により、ライブラリをさまざまなプログラミング言語で作成し、さまざまなオペレーティングシステムやCPUアーキテクチャで実行することができます。
あるJMSブローカから別のJMSブローカに移行する場合のように、ベンダベースのプロトコルロックインはありません。詳細については、https://www.linkedin.com/pulse/jms-vs-amqp-eran-shaham[JMS vs AMQP]およびhttps://spring.io/understanding/AMQP[Understanding AMQP]を参照してください。広く使用されているAMQPブローカーのいくつかはRabbitMQ、OpenAMQ、StormMQです。
** 3.2. AMQPエンティティ
__ **
AMQPエンティティは、Exchange、Queues、およびBindingsで構成されています。
-
交換は常に郵便局やメールボックスとクライアントのようなものです
AMQP取引所にメッセージを公開する ** キューはバインドキーを使用して交換にバインドされます。バインディングは「リンク」です
キューを取引所にバインドするように設定したこと ** メッセージはルーティングキーでメッセージブローカー/交換に送信されます。の
次にexchangeはメッセージのコピーをキューに配布します。 Exchangeは、ファンアウト、階層型ルーティングなど、さまざまなメッセージングルーティングを実現するための抽象化を提供します。
3.3. 交換タイプ
-
交換タイプには4つ組み込まれています.
-
直接交換
-
ファンアウト交換
-
トピック交換
-
ヘッダ交換
-
詳細については、https://www.rabbitmq.com/tutorials/amqp-concepts.html[AMQPの概念]およびhttps://spring.io/blog/2011/04/01/routing-topologies-をご覧ください。 rabbitmqを使ったパフォーマンスとスケーラビリティ/[Routing Topologies]
** 4春のAMQP____
__ **
Spring AMQPは2つのモジュールから構成されています:spring-amqpとspring-rabbitです。それぞれ配布のjarファイルで表されます。春-
Spring-amqpは基本的な抽象概念であり、コアAMQPモデルを表すクラスがあります。それは Exchange、Queue 、および Binding. です。
この記事では、春うさぎ固有の機能について説明します。
** 4.1. spring-amqpの機能____
__ **
-
テンプレートベースの抽象化 - AMQPTemplateインターフェースはすべてを定義します
RabbitTemplate を使用した、メッセージ送受信用の基本操作 実装として 発行元の確認/消費者の承認** サポート
-
基本操作の実行を許可するツール AmqpAdmin
** 4.2. 春うさぎ
__ **
上記で説明したAMQPモデルと関連エンティティは一般的なものであり、すべての実装に適用できます。しかし、実装に特有の機能がいくつかあります。これらの春うさぎの機能のいくつかを以下に説明します。
-
接続管理サポート** - org.springframework.amqp.rabbit.connection.ConnectionFactory インターフェースは、RabbitMQブローカーへの接続を管理するための中心的なコンポーネントです。 ConnectionFactory インターフェースの CachingConnectionFactory 実装の責任は、 org.springframework.amqp.rabbit.connection.Connection インターフェースのインスタンスを提供することです。
spring-rabbitはRabbitMQクライアントの com.rabbitmq.client.Connection インターフェースのラッパーとして Connection インターフェースを提供しています。
-
非同期メッセージ消費** - 非同期メッセージ消費のための2つの重要な概念はコールバックとコンテナです。コールバックはあなたのアプリケーションコードがメッセージングシステムと統合されるところです。
コールバックをコーディングする方法の1つは、 MessageListener インターフェースの実装を提供することです。
public interface MessageListener {
void onMessage(Message message);
}
アプリケーションコードとメッセージングAPIを明確に区別するために、Spring AMQPは MessageListenerAdapter も提供しています。リスナコンテナのSpring Bean設定例は次のとおりです。
MessageListenerAdapter listener = new MessageListenerAdapter(somePojo);
listener.setDefaultListenerMethod("myMethod");
Message-listenコールバックのさまざまなオプションを見たので、コンテナに注意を向けることができます。基本的に、リスナーコールバックが受動的なままでいることができるように、コンテナは「アクティブな」責任を取り扱います。コンテナはライフサイクルコンポーネントの一例です。起動と停止の方法を提供します。
コンテナーを構成するときは、基本的にAMQPキューと MessageListener インスタンスの間のギャップを埋めます。デフォルトでは、リスナコンテナはキューからメッセージを受信する単一のコンシューマを起動します。
** 5 Spring AMQP____を使用してメッセージを送受信する
__ **
Spring AMQPを介してメッセージを送受信する手順は次のとおりです。
-
セットアップとRabbitMQブローカーの起動 - RabbitMQのインストールとセットアップは
簡単です、ちょうど述べられたステップに従ってください ここ 。 Javaプロジェクトの設定 - MavenベースのJavaプロジェクトを作成します。
上記の依存関係 。 メッセージプロデューサーの実装 - RabbitTemplate を使用してメッセージを送信できます。
“こんにちは、世界!”メッセージ:
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); AmqpTemplate template = ctx.getBean(RabbitTemplate.class); template.convertAndSend("Hello, world!");
-
メッセージコンシューマの実装 - 前述のように、実装することができます.
POJOとしてのメッセージコンシューマ
public class Consumer { public void listen(String foo) { System.out.println(foo); } }
-
Wiring Dependencies - 以下のスプリングビーンを使用する
キュー、交換、およびその他のエンティティーをセットアップするための構成。ほとんどのエントリは一目瞭然です。 “ myQueue”という名前のキューは、“ foo。** ”をバインディングキーとして使用してTopic Exchange“ myExchange”にバインドされます。
RabbitTemplate は、デフォルトのルーティングキーとして「foo.bar」を使用して「myExchange」交換にメッセージを送信するように設定されています。 ListenerContainer は、 "myQueue"キューから Foo クラスの__listen()メソッドへのメッセージの非同期配信を保証します。
<rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest"/> <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="myExchange" routing-key="foo.bar"/> <rabbit:admin connection-factory="connectionFactory"/> <rabbit:queue name="myQueue"/> <rabbit:topic-exchange name="myExchange"> <rabbit:bindings> <rabbit:binding queue="myQueue" pattern="foo.** "/> </rabbit:bindings> </rabbit:topic-exchange> <rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener ref="consumer" method="listen" queue-names="myQueue"/> </rabbit:listener-container> <bean id="consumer" class="com.baeldung.springamqp.consumer.Consumer"/>
-
注意** :デフォルトでは、ローカルのRabbitMQインスタンスに接続するために、ユーザー名 "guest"とパスワード "guest"を使用します。
-
アプリケーションを実行します.
-
-
最初のステップは、RabbitMQが動作していることを確認することです。
-
Producer.java を実行し、 main() を実行してアプリケーションを実行します。
方法 ** プロデューサーは、「foo.bar」を「myExchange」に送信します。
ルーティングキー ** 「myQueue」のバインディングキーに従って、メッセージを受け取ります
Listen()を使用した「myQueue」メッセージのコンシューマである** Foo__クラス
コールバックがメッセージを受け取り、それをコンソールに表示するメソッド
6. 結論
この記事では、アプリケーション間の通信にSpring AMQPを使用したAMQPプロトコル上のメッセージングベースのアーキテクチャについて説明しました。
この記事の完全なソースコードとすべてのコードスニペットは、https://github.com/eugenp/tutorials/tree/master/spring-amqp[GitHubプロジェクト]から入手できます。