Javaは、rabbitmqパブリッシュ/サブスクライブモデル(パブリッシュ/サブスクライブキュー)、プロデューサーコンシューマーエクスチェンジメッセージキューを実装します

パブリッシュ/サブスクライブモデルは、ファンアウトモデルまたはブロードキャストモデルとも呼ばれます。複数のコンシューマーが存在する可能性があります。各コンシューマーには独自のキューがあります。各キューはエクスチェンジにバインドする必要があります。プロデューサーから送信されるメッセージは、必要なものだけです。スイッチに送信する場合、スイッチは送信するキューを決定し、プロデューサーは独自に決定できません。交換は、1対多を達成するためにすべてのバインドされたキューにメッセージを送信し、1つのメッセージが複数のコンシューマーによって消費されます。

ここに画像の説明を挿入
ご覧のとおり、このモデルにはスイッチモジュールが必要です。バックグラウンド管理インターフェイスで利用できるスイッチが多数あります。もちろん、必要なスイッチを宣言することもできます。
ここに画像の説明を挿入各仮想ホストは、デフォルトで複数のタイプのスイッチを生成します。ここでは、テストするamqp.fanoutという名前のファンアウトタイプのスイッチを選択します。

  1. プロデューサー
public class Provider {
    
    
    public void send() throws IOException, TimeoutException {
    
    
        Connection connection = null;
        Channel channel = null;
        try {
    
    
            connection = ConnectionUtils.getConnection();
            // 获取连接通道
            channel = connection.createChannel();
            // 定义通道对应的交换机 参数一:交换机名称 参数二:教会及类型 fanout 广播模型
            channel.exchangeDeclare("amqp.fanout","fanout");
            // 发送消息
            channel.basicPublish("amqp.fanout","",null,("fanout message " + System.currentTimeMillis()).getBytes());
        }finally {
    
    
            if (channel !=null && channel.isOpen()) {
    
    
                channel.close();
            }
            if (connection != null && connection.isOpen()) {
    
    
                connection.close();
            }
        }
    }

    public static void main(String[] args) throws IOException, TimeoutException {
    
    
        Provider provider = new Provider();
        provider.send();
    }
}

接続を介してチャネルを取得した後、channel.exchangeDeclare( "amqp.fanout"、 "fanout");を使用して交換を宣言します。交換が存在しない場合、rabbitmqは自動的に作成します。メッセージを送信するときは、exchangeを次のように指定します。 amqp.fanoutで、2番目のパラメーターがEmptyの場合、一時キューを使用します。

  1. 消費者
public class Consumer01 {
    
    
    public void consume() throws IOException, TimeoutException {
    
    
        Connection connection = ConnectionUtils.getConnection();
        // 获取连接通道
        final Channel channel = connection.createChannel();
        // 绑定交换机
        channel.exchangeDeclare("amqp.fanout","fanout");
        //创建临时队列
        String queueName = channel.queueDeclare().getQueue();
        // 绑定交换机和队列
        channel.queueBind(queueName,"amqp.fanout","");
        // 每次只能消费一个消息
        channel.basicQos(1);
        // 消费消息
        channel.basicConsume(queueName, false, new DefaultConsumer(channel) {
    
    
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    
    
                System.out.println("消费消息:" + new String(body));
                try {
    
    
                    Thread.sleep(10);
                } catch (InterruptedException e) {
    
    
                    e.printStackTrace();
                }
                //参数一:确认队列中的那个消息  参数二:是否开启多个消息同时确认
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        });
    }
    public static void main(String[] args) throws IOException, TimeoutException {
    
    
        Consumer01 consumer = new Consumer01();
        consumer.consume();
    }
}

ここでスペースを削減するために、リーダーはConsumer01のコードをコピーして、Consumer02または複数のコンシューマークラスを生成できます。

  1. テスト
    はすべてのコンシューマーを開始し、一時キューを介して交換を監視します。この時点で、実行中のプロデューサーがメッセージを公開し、複数のコンシューマーがスイッチから送信されたメッセージを同時に受信できます。
    コンシューマー1:
    ここに画像の説明を挿入コンシューマー2:
    ここに画像の説明を挿入複数のコンシューマーが同時に同じメッセージを受信し、プロデューサーが再度実行されます。メッセージは、ブロードキャストの形式でスイッチにバインドされた複数のコンシューマーに送信されます。その中で、コンシューマーとスイッチは一時キュー。

おすすめ

転載: blog.csdn.net/qq_41885819/article/details/112870827