在direct演示里,我们的日志系统实现了可选择性的接收日志。但仍旧有一些限制:不能基于多种标准进路由。在一个完整的日志系统中,我们可能不仅要根据日志的严重级别来接收日志,可能需要基于日志的来源来进行路由。
什么叫日志的来源呢?
就是引发日志的设备。比如设备auth/cron/kern。我们可以监听来自corn的错误日志,同时也监听kern的所有日志。这使得我们记录日志更加灵活。
通过topic类型的交换机,我们来演示如何实现这一功能。对于topic交换机的消息的路由键routing key不能任意给定。它必须是一些单词的集合,中间用点号.分割。这些单词可以任意,但通常要体现出消息的特征。一些有效的路由键示例:stock.usd.nyse,nyse.vmw,quick.orange.rabbit。这些路由键可以包含很多单词,但路由键总长度不能超过255个字节。

Topic exchange非常强大,可以实现其他任意路由器的功能。当一个队列以绑定键
#绑定,它将会接收到所有的消息,而无视路由键(实际是绑定键#匹配了任意的路由键)。----这和fanout路由器一样了。当
*和#这两个特殊的字符不出现在绑定键中,Topic exchange就会和direct exchange类似了。<facility>.<severity>为路由键。
消费者:ReceiveLogsTopic

测试参数:日志严重级别info/warn/crit...和设备auth/cron/kern...
测试步骤:
消费者:
将String bingingKeys[] = {""}改为String bingingKeys[] = {"#"},启动第一个消费者;
再改为String bingingKeys[] = {"kern.*"},启动第二个消费者;
再改为String bingingKeys[] = {"*.critical"},启动第三个消费者;
再改为String bingingKeys[] = {"kern.*", "*.critical"},启动第四个消费者。
生产者,发送多个消息,如:
路由键为kern.critical 的消息:A critical kernel error;
路由键为kern.info 的消息:A kernel info;
路由键为kern.warn 的消息:A kernel warning;
路由键为auth.critical 的消息:A critical auth error;
路由键为cron.warn 的消息:A cron waning;
路由键为cron.critical 的消息:A critical cron error;
试试最后的结果:第一个消费者将会接收到所有的消息,第二个消费者将会kern的所有严重级别的日志,第三个消费者将会接收到所有设备的critical消息,第四个消费者将会接收到kern设备的所有消息和所有critical消息。