任何发送到Topic Exchange的消息都会被转发到所有关联RouteKey中指定“topic”的队列上上
这种模式下需要RouteKey,客户端要提前绑定Exchange与Queue。
如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。
客户端在进行绑定时,要提供一个该队列“感兴趣”的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
“#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
简单解释一下上图,一个消息产生者P,一个模式为topic的Exchange(交换机),两个队列,两个消息消费者。
在topic模式下:
如果一个消息的 routing key设置 "quick.orange.rabbit"
即如下
channel.basicPublish(EXCHANGE_NAME, "quick.orange.rabbit", null, "hello".getBytes());
那么该消息将被转发(推送)至Q1、Q2两个队列
如果一个消息的 routing key设置 "quick.orange.fox"
那么该消息将只会被转发(推送)至Q1队列
如果一个消息的 routing key设置 "quick.orange.fox"
那么该消息将只会被转发(推送)至Q2队列
当然,如果一个消息的 routing key设置 " quick.brown.fox "
那么该消息将不会被转发(推送)到任何队列,它将会丢失,即丢弃该消息
前面提到客户端要提前绑定Exchange与Queue
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
并且需要获取一个新的空队列,用来与EXCHANGE进行bi