20200221 - RabbitMQの動作モード

キューワーク
ワークキューは、より多くの消費者側よりも、エントリー手順でキュー内のメッセージを2人の一般的な消費者の最終消費者を比較しました。シナリオ:多くの場合、または複数のタスクのためにあまりにも重い、作業キューの使用は、処理タスクの速度を向上させることができます。
テスト:1、はじめに、複数の消費者を起動します。図2に示すように、生産者の複数のメッセージを送信します。
結果:1、受信したメッセージのみ消費者になり、2、ウサギ方法ポーリングメッセージは平均的な消費者に送信され、図3に示すように、メッセージを処理した後、消費者は、次を受信しますメッセージ
ここに画像を挿入説明
/ subsrcibeパブリッシュ
ここに画像を挿入説明
サブスクライブパブリッシュモデル:
1は、すべての消費者は、独自のキューを監視します。
図2に示すように、各キューにプロデューサブローカ、スイッチは転送メッセージバインドこのスイッチへのメッセージは、各バインディングスイッチは、メッセージキューを受信します

これは、結合した消費者にそれぞれ、2つのキューを産生する、スイッチを有するのと等価です

package com.xuecheng.test.rabbitmq;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Classname Producer02_publish
 * @Description TODO
 * @Date 2020/2/21 15:53
 * @Created by mmz
 */
public class Producer02_publish {
    private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";
    private static final String QUEUE_INFORM_SMS = "queue_inform_sms";
    private static final String EXCHANGE_FANOUT_INFORM="exchange_fanout_inform";

    public static void main(String[] args) {
        //通过连接工厂,创建新的连接
        ConnectionFactory connectionFactory = new ConnectionFactory();

        //设置参数
        connectionFactory.setHost("127.0.0.1");//ip地址
        connectionFactory.setPort(5672);//端口
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //设置虚拟机,一个mqf服务可以设置多个虚拟机,每个虚拟机就相当于独立的mq
        connectionFactory.setVirtualHost("/");

        //生产者和mq建立连接
        Connection connection = null;
        Channel channel = null ;
        try {
            connection =  connectionFactory.newConnection();

            //创建会话通道,所有生产者和mq服务都在channel通道中
            channel = connection.createChannel();
            //声明队列
            //参数
            channel.queueDeclare(QUEUE_INFORM_EMAIL,true,false,false,null);
            channel.queueDeclare(QUEUE_INFORM_SMS,true,false,false,null);
            //声明交换机
            //交换机的类型:
            // fanout:对应的rabbitmq的工作模式是publish/subscribe
            // direct: 路由的工作模式
            // topic:  通配符模式
            // headers: 对应headers工作模式
            channel.exchangeDeclare(EXCHANGE_FANOUT_INFORM, BuiltinExchangeType.FANOUT);
            //交换机和队列进行绑定
            //有一个参数routingkey,在发布订阅模式是一个空穿
            channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_FANOUT_INFORM,"");
            channel.queueBind(QUEUE_INFORM_SMS,EXCHANGE_FANOUT_INFORM,"");
            //发送消息
            for(int i=0;i<5;i++){
                String message = "helloworld mmz";
                channel.basicPublish(EXCHANGE_FANOUT_INFORM,"",null,message.getBytes());
                System.out.println("send to mq" + message);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭连接
            //先关闭通道
            try {
                channel.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

ルーティング
ルーティングモード:
1は、すべての消費者は自分のキュー、およびセットroutingkeyを監視します。
図2は、スイッチによってスイッチメーカーへのメッセージは、指定されたキュー記載routingkeyにメッセージを転送します。

ここに画像を挿入説明

トピックス動作モード
ここに画像を挿入説明

ここに画像を挿入説明

RPCとヘッダーモード

ここに画像を挿入説明

公開された735元の記事 ウォン称賛42 ビュー70000 +

おすすめ

転載: blog.csdn.net/qq_36344771/article/details/104428887