rabbitmqの紹介
Rabbitmqは、AMQPに基づいた完全で再利用可能なエンタープライズメッセージングシステムです
MQはメッセージキューのフルネームです。メッセージキュー(MQ)は、アプリケーションとアプリケーション間の通信方法です。アプリケーションは、それらをリンクするための専用の接続なしに、キューに掲載されたメッセージ(アプリケーションのデータ)を読み書きすることで通信します。メッセージ配信とは、互いに直接呼び出すのではなく、メッセージ内のデータを送信することにより、プログラム間の通信を指します。通常、リモートプロシージャコールなどの手法で直接通話が使用されます。キューイングとは、キューを介して通信するアプリケーションを指します。キューを使用すると、受信と送信アプリケーションの両方が同時に実行されるという要件が排除されます。
AMQPはプロトコルであり、高レベルの抽象化レイヤーメッセージ通信プロトコルです。
同期メッセージングの世界には多くの公的基準(Cobar IIOP、SOAPなど)がありますが、これは非同期メッセージ処理には当てはまりません。大企業のみがいくつかの商業実装(MicrosoftのMSMQ、IBMのWebSphere MQなど)を持っています。したがって、2006年6月、シスコ、レッドハット、イマティックスなどがAMQPの公共基準を共同で策定しました。言い換えれば、AMQPは非同期通信のプロトコルです。
rabbitmqの使用シナリオ
このプロジェクトでは、即時の返品を必要としない時間のかかる操作が非同期に抽出され、処理されます。この非同期処理により、サーバーの要求応答時間が大幅に節約されるため、システムのスループットが改善されます。ただし、それらのほとんどは即座に戻る必要がないだけでなく、実行が成功したかどうかは関係ありません。インスタントリターンが必要な場合は、Dubboを使用できます。 Spring BootはDubboと統合され、Spring Boot IntegrationDubboxを見ることができます
rabbitmq依存関係
Rabbitmqは単純なJARパッケージではありません(JARパッケージは、RabbitMQ自体を使用した基本的な通信関数のみを提供します)。 Dubboと同様に、RabbitMQには他のソフトウェアも実行する必要があります。以下は、RabbitMQが実行されるために必要なソフトウェアです。
1。エルラン
rabbitmqソフトウェア自体はerlangに基づいて開発されているため、rabbitmqを実行したい場合は、最初にerlangに従う必要があります
Erlang公式ウェブサイト
Erlangダウンロードアドレス
rabbitmq
rabbitmqは、メッセージキューを実装するコアです
rabbitmq公式ウェブサイト
rabbitmqダウンロード
rabbitmqの構成
インストールが完了したら、RabbitMQを使用する前に構成を完了する必要があります。コマンド構成を介してRabbitMQのインストールディレクトリの下にあるSBINディレクトリに直接CMDを使用するか、rabbitmqのインストールディレクトリに直接SBINを実行するために、rabbitmqコマンドプロンプト(SBIN dir)を直接見つけることができます。便利なため、最初に管理プラグインを有効にし、コマンドを実行します。
rabbitmq-plugins.bat rabbitmq_managementを有効にします
そうです、これはWindowsの下にあることに注意してください。 Linuxの場合、コウモリの接尾辞はありません。次に、外部ネットワーク環境のユーザーなしでは接続を成功させることができないため、ユーザーを追加します。 Addユーザーコマンドを実行します
rabbitmqctl.bat add_userスプリングブートパスワード
スプリングブートはユーザー名であり、パスワードはパスワードです
次に、デモンストレーションの便宜のために、管理者の許可をSpringbootに提供して、管理ページへのログインを容易にします
rabbitmqctl.bat set_user_tagsスプリングブート管理者
アカウント許可を与えます
rabbitmqctl.bat set_permissions -p / springboot。*。*。*
次に、rabbitmqサービスを開始し、rabbitmq管理ページhttp:// localhost:15672にアクセスして、ログインページを表示します。ユーザーが作成されていない場合は、ゲストとゲストを使用してログインできます。ユーザーが作成されている場合は、作成されたユーザーを使用してログインします。
スプリングブートプロジェクトを作成します
前の記事で何度もスプリングブートプロジェクトを作成することについてすでに言及しているので、ここであまり言いません
rabbitmq関連の依存関係を追加します
<! - rabbitmq-> <dependency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-amqp </artifactid> </dependency>
そうです、ほんの少しの構成ですが、私はこの方法を理解していないかもしれないので、すべての構成を投稿したほうがいいです
<Project XMLNS = "http://maven.apache.org/pom/4.0.0" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation = "http://maven.apach/4.0. http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelversion> 4.0.0 </modelversion> <groupid> wang.raye.rabbitmq </groupid> <artifactid> demo1 </artifactid> <バージョン<name1 </name> <url> http://maven.apache.org </url> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding <artifactid> spring-boot-starter-parent </artifactid> <version> 1.4.0.release </version> </parent> <dependencies> <deplency> junit </groupid> <artifactid> junit </artifactid> <バージョン> 3.8.1 </バージョン<groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web </artifactid> </dependency> <! - rabbitmq-> <依存関係> <グループ</依存関係> </project>
他の操作が行われないため、プロジェクトは現在、主に2つのモジュール、1つのSprig Boot、1つのRabbitMQに依存しています
構成クラスを追加します
パッケージwang.raye.rabbitmq.demo1; Import org.springframework.amqp.core.acknowledgemode; Import org.springframework.amqp.core.binding; Import org.springframework.amqp.core.binding; org.springframework.amqp.core.bindingBuilderをインポートします。 Import org.springframework.amqp.core.directexchange; Import org.springframework.amqp.core.message; Import org.springframework.amqp.core.queue; org.springframework.amqp.rabbit.connection.cachingconnectionfactoryをインポートします。 org.springframework.amqp.rabbit.connection.connectionFactoryをインポートします。 Import org.springframework.amqp.rabbit.core.channelawaremessageListener; Import org.springframework.amqp.rabbit.listener.simplemessageListenercontainer; org.springframework.context.annotation.beanをインポートします。 org.springframework.context.annotation.configuration;/*** rabbitmq configuration class* @author raye* @since 2016年10月12日10:57:44*/ @構成パブリッククラスrabbitmqconfig {/**メッセージスイッチの名前*/パブリックstat string = "my-mq-exchange"; / ** queue key1*/ public static final string routingkey1 = "queue_one_key1"; / ** queue key2*/ public static final string routingkey2 = "queue_one_key2"; / ***構成リンク情報* @return*/ @bean public connectionfactory connectionfactory(){cachingConnectionFactoryFactory = new CachingConnectionFactory( "127.0.0.1"、5672); ConnectionFactory.setUsername( "Springboot"); ConnectionFactory.setPassWord( "パスワード"); ConnectionFactory.setVirtualHost( "/"); connectionfactory.setpublisherconfirms(true); // connectionfactoryを返す必要があります。 } / ***メッセージスイッチの構成*消費者向けFanoutExchangeを構成:ルーティングキーヘッダーヘッダーセックスの概念なしに、すべてのバインドキューにメッセージを配信する:属性キーバリューを追加することによりDirectExchangeを一致させる:ルーティングキーTopicexchangeに従って指定されたキューに配布する:マルチキーマッチング* / @bean DirectChangeデフォルトエクスチャンゲ(真の誤ったexchange(){) } / ** *メッセージqueue 1 * Configure for Consumers * @return * / @bean public queue queue(){return new queue( "queue_one"、true); //永続的}/*** switch* with switch* configure for Consumers* @return*/@bean public binding binding(){return bindingbuilder.bind(queue())。to(defaultexchange())。 } / ** *メッセージqueue 2 * Configure for Consumers * @return * / @bean public queue queue1(){return new queue( "queue_one1"、true); // Quick Persistence}/*** Switchでメッセージキュー2にバインドされている*消費者向け* @return*/@bean public Binding Binding1(){return BindingBuilder.bind(Queue1())。 } / ***メッセージのリスニングを受け入れると、このリスナーはメッセージキュー1*消費者向けのメッセージを受け入れます* @return* / @bean public public simplemessageListenercontainer messageContainer(){simplemessageListenercontainer container = new simplemessageListenercontainer(connectionFactory(); container.setqueues(queue()); container.setexposeListenerchannel(true); container.setMaxConcurrentConsumers(1); container.setConcurrentConsumers(1); container.setackNowledGemode(coundgemode.manual); //確認モードを設定するコンテナを手動で確認します。SetMessagElistener(new ChannelAwaremessagElistener(){public void onmessage(message message、com.rabbitmq.client.channelチャンネル)スロー{byte [] body = message.getbody(); system.out.println( " + new string); channel.basicack(message.getMessageProperties()。getDeliverytag()、false);返品コンテナ。 } / ***メッセージのリスニングを受け入れると、このリスナーはメッセージキュー1*消費者向けのメッセージからメッセージを受け入れます* @return* / @bean public simplemessagelistenercontainer messageContainer2(){simplemessageListenercontainer container = new simplemessagelistenerconerer(connectionfactory(); container.setqueues(queue1()); container.setexposeListenerchannel(true); container.setMaxConcurrentConsumers(1); container.setConcurrentConsumers(1); container.setackNowledGemode(coundgemode.manual); // CONDILATIONモードを手動で設定してCONTERER.SESTMESSAGELISTENER(new ChannelAwareMessagElistener(){public void onmessage(message message、com.rabbitmq.client.channelチャンネル)スロー{byte [] body = message.getbody(); system.out.println channel.basicack(message.getMessageProperties()。getDeliverytag()、false);返品コンテナ。 }}設定方法をより適切に実証するために、2つのメッセージキューを構成したことに注意してください。リンク構成が構成されている場所を除き、このクラスの残りの部分はメッセージ消費者を対象としています。もちろん、メッセージ消費者とメッセージプロデューサーの両方がリンク情報を構成する必要があります。便利なため、このプロジェクトの消費者とプロデューサーはどちらもこのプロジェクトにあります。一般的に、実際のプロジェクトは同じプロジェクトには含まれません。コメントは非常に詳細であるため、あまり言いません。
メッセージを送信します
メッセージの送信を容易にするために、インターフェイスにアクセスしてメッセージを送信する方法を呼び出すために、コントローラーを直接書きました。これ以上苦労せずに、コードを追加してください
wang.raye.rabbitmq.demo1; Import java.util.uuid; Import org.springframework.amqp.rabbit.core.rabbittemplate; org.springframework.amqp.rabbit.support.correlationdataをインポートします。 org.springframework.web.bind.annotation.requestmappingをインポートします。 org.springframework.web.bind.annotation.restcontroller;/** * rabbitmqのコントローラーをテストしてメッセージを送信するようにテスト * @author raye * */ @restcontrollerpublic class sendcontrollerはrabbittemplate.confirmcallback {private rabbittemplate rabbitemplate; /***メッセージを送信するようにrabbittemplateを構成します。コンストラクターであるため、スプリングは注釈なしで自動的に注入されます(新しいバージョンの機能である必要があります) * @param rabbittemplate */ public sendcontroller(rabbittemplate rabbittemplate){this.rabbittemplate = rabbittemplate; //消費コールバックthis.rabbittemplate.setConfirmCallback(this); } / ** *メッセージをメッセージキューに送信します1 * @param msg * @return * / @requestmapping( "send1")public string send1(string msg){string uuid = uuid.randomuid()。toString(); correlationData clonserenceID = new CorrelationData(UUID); rabbittemplate.convertandsend(rabbitmqconfig.exchange、rabbitmqconfig.routingkey1、msg、constornenceId); nullを返します。 } / ** *メッセージをメッセージに送信キュー2 * @param msg * @return * / @requestMapping( "send2")public string send2(string msg){string uuid = uuid.randomuid()。toString(); CorrelationData CorrelationID = new CorrelationData(UUID); rabbittemplate.convertandsend(rabbitmqconfig.exchange、rabbitmqconfig.routingkey2、msg、correlationid); nullを返します。 } / ***メッセージコールバック、主にrabbittemplate.confirmcallbackインターフェイスの実装*メッセージコールバックはRabbitmqサーバーに送信された成功したメッセージのみを表すことができることに注意してください。 if(ack){system.out.println( "メッセージ消費が失敗した:" + cause + "/n resend"); }}}メッセージコールバックは、RabbitMQサーバーに送信される成功したメッセージのみを表すことができることに注意する必要があります。
次に、プロジェクトを開始し、http:// localhost:8082/send1?msg = aaaaにアクセスすると、コンソール出力は
受信メッセージ:AAAA
コールバックID:CorrelationData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
ニュースの消費の成功
もちろん、コールバックIDが異なる場合があります。 http:// localhost:8082/send2?msg = bbbbにアクセスすると、出力はなります
Queue1メッセージ:BBBB
コールバックID:CorrelationData [ID = 0CEC7500-3117-4AA2-9EA5-4790879812D4]
ニュースの消費の成功
最後にいくつかの言葉
この記事は主にrabbitmqをゼロからスプリングブートに統合する方法を説明しているため、rabbitmqの多くの情報と使用について説明はありません。 RabbitMQ自体に慣れていない場合は、RabbitMQに関する他の記事をチェックして、この記事のデモを添付できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。