Topic交换器类型与Direct类似,都是通过路由键来匹配消息队列,不同之处是Direct是通过完全匹配路由键的名称对应,而Topic类型支持规则匹配,也即支持通配符的方式。
下面通过不同的服务对不同级别的日志发送到不同规则的消息队列
一、创建接收者(消费者)项目
1.设置配置文件application.properties
设置相应的RabbitMQ的服务器和相应的交换器名称,队列名称,如下图
这里可以不配置路由键,因为用的是规则匹配,一般配置好了,不会再改,直接配置在注解上就可以。
2.创建日志级别的信息接收者,以匹配所有的日志为例。
可以参考上一个例子(Direct交换类型),这里的路由键使用的是规则匹配,例如不论是哪个服务产生的哪种级别的日志都要求被接收,设置的路由键格式如: *.log.*。那么在发送消息时,设置的路由键符合这个格式即可。
LogReceiver.java
需要单独接收的2个日志级别,Error、Info 的类跟LogReceiver.java类似,只需要将相应的队列名称和路由键改掉即可。
队列名称就是配置文件里相应的参数,路由键分别为: *.log.error、*.log.info。
二、 设置消息发送者(生产者)项目
1.设置配置文件application.properties
这里也不要配置路由键,因为使用的规则匹配,只要在使用的时候符合定义的规则即可,而在实际使用中,可能会根据不同的功能定义不同的路由键,这就会导致路由键比较多了,也就不太合适在这里配置了。
2.创建发送者(以用户服务为例)
UserSender.java
这里发送了4种级别的日志消息,并且每种消息对应相应的路由键,理论上控制台会发出6条语句,
4条是all-->开头,一条以info-->开头,一条以error-->开头。
这里先直接给出结果。
产品服务和订单服务的发送者和用户服务类似,只要将相应的路由键修改成相应的匹配规则即可,
例如产品的路由键规则为 product.logo.info 、product.logo.error等。
三、测试类
订单服务、产品服务的测试类类似,运行的结果如下。