(使用Java客户端)
一、概述
在路由消息分发的学习中,对日志记录系统做了改进,使用direct exchange来替换fanout exchange进行消息分发,可以使日志系统有了直接、并且可以有选择的接收消息。
尽管使用direct exchange改进了系统,但是它仍然有局限性,就是不能根据多个标准来分发消息。
在日志系统中,我们也许想订阅的不仅仅是基于日志消息的严重程度,而且可能是基于日志消息的发送源。
这将给我们带来很多的灵活,我可能想坚挺的错误来自"cron"的消息源,而不是来自"kern"消息源发送的所有消息。
为了按照上述的要求改进我们的日志系统,所以我们需要学习一种更为复杂的exchange.
二、实现步骤
2.1、Topic exchange
消息被发送到一个topic exchange不能使用一个随意的routingKey,而它必须是一个由点号(.)隔开的单词列表,这些单词可以使任何字符,但是它们通常有一些特性用来指定分发的消息,一些有效的routingKey的例子,比如"stock.mus.nyse","nyse.vmw","quick.orange.rabbit",可以用自己喜欢的许多单词来作为routingKey,但是最多不能超过255个字符。
绑定Key必须是相同的形式,topic exchange的逻辑绑定类似与一个direct exchange的丁丁,一个被发送的消息带着一个特定的routingKey被传递到所有与之匹配的routingKey的queues中,但是topic exchange有两个特殊的情况。
1、*(星号)可以代替一个确切的词
2、#(井号)可以替换零个或者多个词
以下是一个最容易的例子的说明:
图-1
说明:
在这个实例中,要发送描述动物的所有消息,该消息将routingKey包含三个单词,两个点号,在routingKey的第一部分描述速度、第二部描述颜色、第三部分描述种类。格式为:"<speed>.<colour>.<species>"。
创建了三个绑定,Q1绑定key为“*.orange.*”,Q2队列的绑定key为"*.*.rabbit"和"lazy.#".
这些绑定可以概括为:
>Q1是一对所有orange的舞动感兴趣的队列。
>Q2项坚挺关于兔子和懒惰的动物一切消息的队列。
若一个消息绑定的key设置为"quick.orange.rabbit"将被发送到所有队列,因为它匹配所有消息队列的绑定关系,消息绑定key为"lazy.orange.elephant"也将被发送到所有的消息队列中,另外一方面,若某条消息绑定key为"quick.orange.fox"仅仅将被发送到Q1中,"lazy.pink.rabbit"这样的绑定key仅仅只有一次被传递到Q2中,即使它符合匹配两个绑定,像"quick.brown.fox"不匹配任何绑定的队列,这些消息将会被丢弃。
如果我们打破上述的这些规则发送包含一个单词或者四个单