RabbitMQ の入門 (RabbitMQ のインストール + RabbitMQ インストールプロセス中のバージョンなどの問題の解決 + RabbitMQ サービスの起動の失敗などの問題の解決 + Java クライアントの使用)
1. はじめに - 公式ウェブサイトを参照
1.1 公式ウェブサイトのアドレス
1.2 バージョン比較に注意する
- Linux バージョンでサポートされている RabbitMQ のバージョンに注意してください
- Linux でサポートされている Erlang のバージョンに注意してください
- RabbitMQ でサポートされている Erlang のバージョンに注意してください
- バージョンの対応関係の詳細については、以下のリンク
https://www.rabbitmq.com/that-erlang.htmlを参照してください。
- バージョンの対応関係の詳細については、以下のリンク
2. ダウンロードしてインストールします
2.1 erlang をダウンロードしてインストールする
2.1.1 Linuxのバージョンを確認する
- 私の側はcentosで、コマンドは次のとおりです。
cat /etc/centos-release
2.1.2 現在のシステムでサポートされている erlang のバージョンを確認する
- コマンドは次のとおりです。
uname -a
2.1.3 アーランのダウンロード
- ダウンロードアドレス:
https://github.com/rabbitmq/erlang-rpm。 - システムでサポートされている Linux バージョンと erlang バージョンに応じて、次のように対応する erlang をダウンロードします。
- そこで、私がここでダウンロードしたものは
Erlang 23.3.4.18
次のとおりです (注: 独学で学習している場合は、CenOS8 に変更することをお勧めします。また、Ubuntu などの他のディストリビューションに直接変更することも最善です)。
2.1.4 アーランのインストール
- インストールコマンドは以下のとおりです。
rpm -ivh erlang-23.3.4.18-1.el7.x86_64.rpm
2.1.5 発生した問題
- 説明: この問題はインストール
erlang-23.3.4.18-1.el8.x86_64.rpm
( )el8
が原因で発生しますが、インストールerlang-23.3.4.18-1.el7.x86_64.rpm
(el7
) には問題はありません。上記の確認によれば、私の Linux システムはそれをサポートしているためel7
、バージョンの問題かどうかはわかりません。 - 次のように:
error: Failed dependencies: libtinfo.so.6()(64bit) is needed by erlang-23.3.4.18-1.el8.x86_64 libz.so.1(ZLIB_1.2.7.1)(64bit) is needed by erlang-23.3.4.18-1.el8.x86_64
- 問題の解決:
さらに--nodeps --force
、このコマンドの機能: パッケージ間の依存関係を分析して直接インストールすることはなくなりました。rpm -ivh erlang-23.3.4.18-1.el8.x86_64.rpm --nodeps --force
2.2 socatのインストール
- インストールコマンドは以下のとおりです。
yum install socat -y
2.3 Rabbitmq-server をダウンロードしてインストールする
2.3.1 Rabbitmqサーバーのダウンロード
- RabbitMQ をダウンロードするときは、上記でダウンロードした Erlang のバージョン (
Erlang 23.3.4.18
) に注意して、対応する RabbitMQ のバージョンを見つけてください。
ダウンロード アドレス 1: https://github.com/rabbitmq/rabbitmq-server/releasesのように、新しいバージョンを見つけるのは簡単ですが、古いバージョンを見つけるのは困難です。- ダウンロードアドレス2:rpm倉庫
https://packagecloud.io/rabbitmq。
- Linux システムと Erlang のバージョンに応じて、次のように対応する Rabbitmq バージョンを見つけます。
2.3.2 Rabbitmq-server のインストール
- インストールコマンドは以下のとおりです。
rpm -ivh rabbitmq-server-3.9.13-1.el7.noarch.rpm
3. サービスを開始する
3.1 サービスを開始する
- インストール後、インストール ディレクトリを見つけます。
whereis rabbitmq
- インストール
sbin
ディレクトリを入力します。
- サービス開始:
./rabbitmq-server start
- サービスが開始されているかどうかを確認します。
ps -ef | grep rabbitmq
3.2 サービスの起動に失敗する
3.2.1 バージョンの問題
- 起動に失敗した場合は、erlang がインストールされているか、または erlang のバージョンが正しいかどうかを確認してください。
rpm -qa|grep erlang
- 間違ったバージョンがインストールされている場合は
erlang
、アンインストールして再インストールできます (rabbitmq は erlang に依存しているため、アンインストールする前に Rabbitmq をアンインストールしてください)。アンインストール コマンドは次のとおりです。# 1. 卸载rabbitmq-server rpm -e rabbitmq-server rm -rf /usr/lib/rabbitmq # 2. 卸载erlang rpm -e erlang rm -rf /usr/lib64/erlang
- 次に、正しいバージョンを再インストールします。
4. 管理インターフェイスにアクセスします
4.1 グラフィカル管理インターフェイスを開く
- Rabbitmq が起動している場合は、サービスを停止してから Web インターフェイス プラグインをインストールします。コマンドは次のとおりです。
rabbitmq-plugins enable rabbitmq_management
4.2 占有ポートの確認
-
次のように:
ps -ef | grep rabbit lsof -i | grep pid
4.3 ポート 15672 を開く
- 次の記事を参照してください。
Linux でのファイアウォールのステータスの確認、ファイアウォールの無効化、ポートの開閉など。
4.4 管理インターフェイスへのアクセス
- 住所:
http://服务器IP:15672/
4.5 ログインの問題
4.5.1 問題点
- ユーザー名とパスワードは両方とも「guest」でログインします。ログイン後のプロンプトは次のようになります。
4.5.2 トラブルシューティング - 新しいユーザーの作成
- インストール ディレクトリに入り、ユーザーとロールを表示します。
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.13/sbin ./rabbitmqctl list_users
- 新しいユーザーを作成する
- ステップ 1: mqAdmin ユーザーを追加し、パスワード 123456 を設定します。
rabbitmqctl add_user mqAdmin 123456
- ステップ 2: ユーザー ロールを設定します (mqAdmin ユーザーを管理者ロールに設定します)
rabbitmqctl set_user_tags mqAdmin administrator
- ステップ 3: ユーザー権限を設定する (仮想ホストと書き込み/読み取り許可アクセスを指定)
rabbitmqctl set_permissions -p "/" mqAdmin ".*" ".*" ".*"
- ステップ 4、以下を確認します。
- ステップ 1: mqAdmin ユーザーを追加し、パスワード 123456 を設定します。
4.6 ログイン - 新しいユーザーの使用
- 次のように、上記で新しく作成したユーザーを使用して
mqAdmin
ログインします。
5. サービスおよびその他の関連コマンドの開始、停止
5.1 起動コマンド
5.1.1 起動方法
- 方法1: は上記で使用されているもので、インストール ディレクトリの sbin ディレクトリに入り、次を開始します。
cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.13/sbin/ ./rabbitmq-server start
- 方法 2:次のように起動を設定します。
chkconfig rabbitmq-server on
- 方法3:サービスコマンド起動(任意のディレクトリで実行可能)
service rabbitmq-server start
5.1.2 起動の問題——rabbitmq-server.service のジョブが失敗しました……
5.1.2.1 質問
service rabbitmq-server start
コマンドを使用してエラー報告問題を開始する場合、問題の説明は次のようになります。Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
5.1.2.2 問題の解決
5.1.2.2.1 試み 1:
journalctl -xe
コマンドを実行して詳細な問題を表示します。
- 問題を解決します (/var/log/rabbitmq/ ディレクトリ内の 2 つのログ ファイルのグループと所有者を Rabbitmq に変更します)。
cd /var/log/rabbitmq/ chown -R rabbitmq:rabbitmq rabbit@hello_TQ1*
5.1.2.2.2 試み 2:
- 上記の問題を解決した後、再起動してもエラーが発生する場合は、
journalctl -xe
次のようにコマンドを再度実行して詳細な問題を表示します。
- 解決策は上記と同じで、次のように、エラーを報告せずにコマンドを再度
実行します。service rabbitmq-server start
5.2 よく使用されるコマンドのまとめ
- サービス開始
service rabbitmq-server start
- 故障中
service rabbitmq-server stop
- サービスを再起動する
service rabbitmq-server restart
6. クイックスタート
6.1 コンソールでメッセージ送信をシミュレートする
-
スイッチを作成するには、もちろんデフォルトのスイッチを使用できますが、ここでは手間を省くためにデフォルトのスイッチを使用します。amq.ファンアウト。
-
キューの作成
-
スイッチは次のようにキューをバインドします。
-
メッセージを送る
-
チェック
6.2 Java クライアント - 基本コード
6.2.1 pom ファイル
- 次のように:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo1</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>rabbitmq-demo1</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- rabbitmq依赖客户端--> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.8.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> </project>
6.2.2 プロデューサー
- テスト:
- 効果を確認する
- 付属コード
package com.liu.susu.example; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * @Description 生产者 * @Author susu */ public class Producer { // 队列名称 public static final String QUEUE_NAME = "queue-hello"; public static void main(String[] args) throws Exception{ //1. 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //2. 工厂IP连接rabbitmq的队列 factory.setHost("服务IP地址"); //3. 连接用户名和密码 factory.setUsername("mqAdmin"); factory.setPassword("123456"); //4. 创建连接 Connection connection = factory.newConnection(); //5. 获取信道 Channel channel = connection.createChannel(); /** * 6. 创建一个队列 */ channel.queueDeclare(QUEUE_NAME,false,false,false,null); //7. 定义发送消息的内容 String msg = "hello world!!!,我来之于Java程序"; /** * 8. 发送消息 * 1. 参数1:交换机(发送到哪个交换机上) * 2. 参数2:路由key的值(本次发送用的队列名称) * 3. 参数3:其他参数信息 (本次没有,直接null) * 4. 参数4:发送消息的消息体 */ channel.basicPublish("",QUEUE_NAME,null,msg.getBytes()); System.out.println("=====消息发送成功====="); } }
6.2.3 消費者
-
消費する前に、まずキュー内のメッセージを読み取ります
-
消費者消費メッセージをテストする
-
消費後、キュー内のメッセージを確認します
-
添付コード:
package com.liu.susu.example; import com.rabbitmq.client.*; /** * @Description 消费者 接收消息 * @Author susu */ public class Consumer { // 队列名称 public static final String QUEUE_NAME = "queue-hello"; public static void main(String[] args) throws Exception{ //1. 创建连接工厂 ConnectionFactory factory = new ConnectionFactory(); //1.1. 工厂IP连接rabbitmq的队列 factory.setHost("服务IP地址"); //1.2. 连接用户名和密码 factory.setUsername("mqAdmin"); factory.setPassword("123456"); //2. 创建连接 Connection connection = factory.newConnection(); //3. 获取信道 Channel channel = connection.createChannel(); // 接收消息后的回调 DeliverCallback deliverCallback = (consumerTag,msg)->{ byte[] msgBody = msg.getBody(); System.out.println("消费的消息是:" + new String(msgBody)); }; // 取消消息时的回调 CancelCallback cancelCallback = (consumerTag)->{ System.out.println("===消息消费被取消===="); }; /** * 4. 消费者消费消息 * 1. 参数1:消费哪个队列 * 2. 参数2:消费成功之后是否要自定应答 * true——自动应答 * false——手动应答 * 3. 参数3:消费者接收消息后的回调方法 * 4. 参数4:消费者取消消费的回调(正常接收不调用) */ channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback); } }
6.2.4 発生した問題
6.2.4.1 問題 1—接続がタイムアウトした
- 問題の説明: 操作がタイムアウトしました (接続がタイムアウトしました)
- 問題の解決
クラウド サービスの場合、セキュリティ グループでポートを開くと5672
問題を解決できる場合があります。
6.2.4.2 質問 2—接続が拒否されました
- 質問は次のとおりです。
Connection refused (Connection refused)
- 問題の解決
ファイアウォールが閉じられていない場合は、5672
ファイアウォールのポートを開いてください。sudo firewall-cmd --add-port=5672/tcp --permanent firewall-cmd --reload
6.3 Java クライアント - Spring AMQP
6.3.1 はじめに
- AMQP (Advanced Message Queuing Protocol) は、アプリケーション間でビジネス メッセージを配信するためのオープン スタンダードです。このプロトコルは言語プラットフォームとは何の関係もなく、マイクロサービスの独立性の要件により一致しています。
- Spring AMQP は、AMQP プロトコルに基づく一連の API 仕様であり、メッセージを送受信するためのテンプレートを提供します。
- Spring AMQP は
spring-amqp
2 つのspring-rabbit
部分で構成されます。spring-amqp は基本的な抽象化であり、spring-rabbit は基礎となるデフォルト実装です。 - 公式ウェブサイトを参照してください:
https://spring.io/projects/spring-amqp。
- Spring AMQP は
6.3.2 プロジェクトの構造
-
ディレクトリ構造
-
親pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo2</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>rabbitmq-demo2</name> <url>http://maven.apache.org</url> <modules> <module>producer</module> <module>consumer</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>3.8.1</junit.version> <lombok.version>1.16.8</lombok.version> <spring-boot.version>2.7.16</spring-boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>2.7.14</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <!-- <dependency>--> <!-- <groupId>junit</groupId>--> <!-- <artifactId>junit</artifactId>--> <!-- <version>${junit.version}</version>--> <!-- <scope>test</scope>--> <!-- </dependency>--> </dependencies> </dependencyManagement> </project>
6.3.3 プロデューサーサービス
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>producer</artifactId> <packaging>jar</packaging> <name>producer</name> <description>producer</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--单元测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins> </build> </project>
-
アプリケーション.yml
spring: rabbitmq: host: 服务IP地址 # 服务IP port: 5672 # 端口(发送消息的端口5672 rabbitmq管理界面的端口15672) # virtual-host: /mqAdmin # 虚拟主机 username: mqAdmin # 用户名 password: 123456 # 密码
-
メッセージ送信用のテストクラス
package com.liu.susu.producer; import org.junit.jupiter.api.Test; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /** * @Description * @Author susu */ @SpringBootTest public class ProducerTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void publishMsg(){ System.out.println("---------------------"); String queueName = "queue-hello"; String msg = "hello,I am from amqp!!!"; //发送消息 rabbitTemplate.convertAndSend(queueName,msg); System.out.println("amqp——消息发送成功!!!"); } }
-
テストして効果を確認する
6.3.4 消費者サービス
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.liu.susu</groupId> <artifactId>rabbitmq-demo2</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>consumer</artifactId> <packaging>jar</packaging> <version>0.0.1-SNAPSHOT</version> <name>consumer</name> <description>consumer</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- AMQP依赖,包含RabbitMQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
アプリケーション.yml
logging: pattern: dateformat: HH:mm:ss:SSSS spring: rabbitmq: host: 服务IP地址 # 服务IP port: 5672 # 端口(发送消息的端口5672 rabbitmq管理界面的端口15672) # virtual-host: /mqAdmin # 虚拟主机 username: mqAdmin # 用户名 password: 123456 # 密码
-
メッセージを受信するコンポーネント
package com.liu.susu.consumer.listeners; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; /** * @Description * @Author susu */ @Component public class MqListener { @RabbitListener(queues = "queue-hello") //监听的队列 public void listenQueues(String msg){ System.out.println("消费者收到消息===>"+msg); } }
-
サービスを開始してテストして効果を確認する
6.4 追加項目
- プロジェクトをダウンロードします:
Rabbitmq-demo (Java クライアント - 基本コード + Java クライアント - Spring AMQP)
。