1、简介
前面学习了有选择性的接收消息,但是却没有办法基于多个标准来接收消息。为了实现这个目的,接下来我们学习如何使用另一种更复杂的交换机 —— 主题交换机。
2、主题交换机
发送到主题交换机(topic exchange)的消息不可以携带随意什么样子的路由键(routing_key),它的路由键必须是一个由.
分隔开的词语列表。这些单词随便是什么都可以,但是最好是跟携带它们的消息有关系的词汇。以下是几个推荐的例子:"stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit"。词语的个数可以随意,但是不要超过255字节。绑定键也必须拥有同样的格式。
主题交换机背后的逻辑跟直连交换机很相似 —— 一个携带着特定路由键的消息会被主题交换机投递给绑定键与之想匹配的队列。但是它的绑定键和路由键有两个特殊应用方式:
(1)*
(星号) 用来表示一个单词
(2)#
(井号) 用来表示任意数量(零个或多个)单词。
主题交换机示例:
这个例子里,发送的消息所携带的路由键是由三个单词所组成的,这三个单词被两个.
分割开。一个携带有 quick.orange.rabbit
的消息将会被分别投递给这两个队列。携带着 lazy.orange.elephant
的消息同样也会给两个队列都投递过去。另一方面携带有 quick.orange.fox
的消息会投递给第一个队列,携带有 lazy.brown.fox
的消息会投递给第二个队列。携带有 lazy.pink.rabbit
的消息只会被投递给第二个队列一次,即使它同时匹配第二个队列的两个绑定。携带着 quick.brown.fox
的消息不会投递给任何一个队列。
如果我们违反约定,发送了一个携带有一个单词或者四个单词("orange"
or "quick.orange.male.rabbit"
)的消息时,发送的消息不会投递给任何一个队列,而且会丢失掉。但是另一方面,即使 "lazy.orange.male.rabbit"
有四个单词,他还是会匹配最后一个绑定,并且被投递到第二个队列中。
3、消息发送和接收
主题交换机的消息发送和接收写法和路由交换机一致,只需要将类型换成主题交换机:
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC);
然后,路由键的规则满足主题交换机的规则即可。