RabbitMq学习笔记(五)—— Topic

ReceiveTopicOne 匹配规则1

//声明交换器和队列

channel.exchangeDeclare(EXCHANGE_NAME, "topic");

String queueName = channel.queueDeclare().getQueue();

//路由关键字规则

String[] routingKeys = new String[]{"*.*.rabbit", "lazy.#"}; 

//绑定路由关键字

for (String bindingKey : routingKeys) {  

      channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);  

 }  


ReceiveTopicTwo 匹配规则2

//声明交换器和队列

channel.exchangeDeclare(EXCHANGE_NAME, "topic");

String queueName = channel.queueDeclare().getQueue();

//路由关键字规则

String[] routingKeys = new String[]{"*.orange.*"};  

//绑定路由关键字

for (String bindingKey : routingKeys) {  

     channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);  

}  


TopicSend 发送

channel.exchangeDeclare(EXCHANGE_NAME, "topic");  

//待发送信息

String[] routingKeys = new String[]{"quick.orange.rabbit",

                                                            "lazy.orange.elephant",   

                                                            "quick.orange.fox",   

                                                            "lazy.brown.fox",   

                                                            "quick.brown.fox",   

                                                            "quick.orange.male.rabbit",   

                                                            "lazy.orange.male.rabbit"};  

for (String bindingKey : routingKeys) {  

     channel.queueBind(queueName, EXCHANGE_NAME, bindingKey);  

}  


                         

     

                   



用三个关键字来绑定,Q1绑定关键字是【*.orange.*】,Q2绑定关键字是【*.*.rabbit】和【lazy.#】,然后分析会发生什么:


  • Q1会收到所有orange这种颜色相关的消息

  • Q2会收到所有rabbit这个动物相关的消息和所有速度lazy的动物的消息

 分析:

生产者发送“quick.orange.rabbit”的消息,两个队列都会收到

生产者发送“lazy.orange.elephant”,两队列也都会收到。

生产者发送"quick.orange.fox",那么只有Q1会收到。

生产者发送"lazy.brown.fox",那么只会有Q2能收到。

生产者发送"quick.brown.fox",那么这条消息会被丢弃,谁也收不到。

生产者发送"quick.orange.male.rabbit",这个消息也会被丢弃,谁也收不到。

生产者发送"lazy.orange.male.rabbit",这个消息会被Q2的【lazy.#】规则匹配上,发送到Q2队列中。


注意

交换器在匹配模式下:

如果消费者端的路由关键字只使用【#】来匹配消息,在匹配【topic】模式下,它会变成一个分发【fanout】模式,接收所有消息。

如果消费者端的路由关键字中没有【#】或者【*】,它就变成直连【direct】模式来工作。



评论

© dzxlovelar | Powered by LOFTER