Spring AMQPを使ったメッセージング

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. 交換タイプ

  1. 交換タイプには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を介してメッセージを送受信する手順は次のとおりです。

  1. セットアップとRabbitMQブローカーの起動 - RabbitMQのインストールとセットアップは

簡単です、ちょうど述べられたステップに従ってください ここ Javaプロジェクトの設定 - MavenベースのJavaプロジェクトを作成します。

上記の依存関係 。 メッセージプロデューサーの実装 - RabbitTemplate を使用してメッセージを送信できます。

“こんにちは、世界!”メッセージ:

AbstractApplicationContext ctx
  = new ClassPathXmlApplicationContext("beans.xml");
AmqpTemplate template = ctx.getBean(RabbitTemplate.class);
template.convertAndSend("Hello, world!");
  1. メッセージコンシューマの実装 - 前述のように、実装することができます.

POJOとしてのメッセージコンシューマ

public class Consumer {
    public void listen(String foo) {
        System.out.println(foo);
    }
}
  1. 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"を使用します。

    1. アプリケーションを実行します.

  • 最初のステップは、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プロジェクト]から入手できます。