在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消息。
