最近刚开始学习RabbitMQ,这里记录一下我的学习心得,欢迎大家来讨论!
RabbitMQ的交换机有四种类型:分别是 直接(direct), 主题(topic) ,标题(headers) , 扇出(fanout)
接下来主要讲解的是: 直接(direct), 主题(topic) ,扇出(fanout)
我觉得可以用mybatis的思想来理解这三种类型:
一、扇出(fanout):是一对多的;它将接收到的信息广播到每个它绑定的队列;
绑定代码:
//连接Channel
Channel channel = RabbitMqUtils.getChannel();
//定义交换机的名称和类型
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//交换机绑定队列(方法的参数分别为:队列名、交换机名、路由键)
channel.queueBind(QueueName, EXCHANGE_NAME, "");
解释:当定义了交换机的类型为【fanout】时,绑定的路由键是是可以忽略的,信息会发布到所有绑定这个交换机的队列。
二、直接(direct):是一对一的;它将接收到的信息根据绑定的RoutingKey,发布到对应的RoutingKey队列;
绑定代码:
//连接Channel
Channel channel = RabbitMqUtils.getChannel();
//定义交换机的名称和类型
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//交换机绑定队列(方法的参数分别为:队列名、交换机名、路由键)
String QueueName1 = "Q1";
String QueueName2 = "Q2";
channel.queueBind(QueueName1, EXCHANGE_NAME, "orange");
channel.queueBind(QueueName2, EXCHANGE_NAME, "black");
channel.queueBind(QueueName2, EXCHANGE_NAME, "green");
解释:当定义了交换机的类型为【direct】时,绑定的路由键是必须要定义的,消息会根据routingKey来发布到对应的队列,如果这时候传递过来的信息的路由键为"red",因为没有进行绑定无法匹配,则会被丢弃。
三、主题(topic):是多对多的;当我们想接收的日志类型有info.base 和 info.advantage,但是某个队列只需要info.base时,这时使用redict是明显做不到的,这时候只能使用topic;topic和redict的用法是一致的,区别在于路由键的使用,所以主题交换机的路由键是不能随意写的,它必须满足一定的要求。
要求:必须是一个单 词列表,以点号分隔开。这些单词可以是任意单词,比说:"stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit".这种类型的。当然这个单词列表最多不能超过 255 个字节。
//连接Channel
Channel channel = RabbitMqUtils.getChannel();
//定义交换机的名称和类型
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
//交换机绑定队列(方法的参数分别为:队列名、交换机名、路由键)
String QueueName1 = "Q1";
String QueueName2 = "Q2";
channel.queueBind(QueueName1, EXCHANGE_NAME, "*.orange.*");
channel.queueBind(QueueName2, EXCHANGE_NAME, "*.*.rabbit");
channel.queueBind(QueueName2, EXCHANGE_NAME, "lazy.#");
Map<String, String> bindingKeyMap = new HashMap<>();
bindingKeyMap.put("quick.orange.rabbit","被队列 Q1Q2 接收到");
bindingKeyMap.put("lazy.orange.elephant","被队列 Q1Q2 接收到");
bindingKeyMap.put("quick.orange.fox","被队列 Q1 接收到");
bindingKeyMap.put("lazy.brown.fox","被队列 Q2 接收到");
bindingKeyMap.put("lazy.pink.rabbit","虽然满足两个绑定但只被队列 Q2 接收一次");
bindingKeyMap.put("quick.brown.fox","不匹配任何绑定不会被任何队列接收到会被丢弃");
bindingKeyMap.put("quick.orange.male.rabbit","是四个单词不匹配任何绑定会被丢弃");
bindingKeyMap.put("lazy.orange.male.rabbit","是四个单词但匹配 Q2");
结果:
发布信息:
队列Q1接收到的信息:
队列Q2接收到的信息:
CYSWAN~