RabbitMQ の入門 (RabbitMQ のインストール + RabbitMQ インストールプロセス中のバージョンなどの問題の解決 + RabbitMQ サービスの起動の失敗などの問題の解決 + Java クライアントの使用)

RabbitMQ の入門 (RabbitMQ のインストール + RabbitMQ インストールプロセス中のバージョンなどの問題の解決 + RabbitMQ サービスの起動の失敗などの問題の解決 + Java クライアントの使用)

1. はじめに - 公式ウェブサイトを参照

1.1 公式ウェブサイトのアドレス

1.2 バージョン比較に注意する

  • Linux バージョンでサポートされている RabbitMQ のバージョンに注意してください
    ここに画像の説明を挿入します
  • Linux でサポートされている Erlang のバージョンに注意してください
    ここに画像の説明を挿入します
  • RabbitMQ でサポートされている Erlang のバージョンに注意してください
    ここに画像の説明を挿入します

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サーバーのダウンロード

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 を開く

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、以下を確認します。
      ここに画像の説明を挿入します

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-amqp2 つのspring-rabbit部分で構成されます。spring-amqp は基本的な抽象化であり、spring-rabbit は基礎となるデフォルト実装です。
    • 公式ウェブサイトを参照してください:
      https://spring.io/projects/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 追加項目

おすすめ

転載: blog.csdn.net/suixinfeixiangfei/article/details/133341025