RabbitMQ学习第四记:路由模式(direct)

1、什么是路由模式(direct)

  路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据。与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机推送过来的数据。而路由模式下加了一个路由设置,生产者向交换机发送数据时,会声明发送给交换机下的那个路由,并且只有当消费者的队列绑定了交换机并且声明了路由,才会收到数据。下图取自于官方网站(RabbitMQ)的路由模式的图例

RabbitMQ学习第四记:路由模式(direct)

P:消息的生产者

X:交换机

红色:队列

C1,C2:消息消费者

error,info,warning:路由

  举个日志处理例子:系统需要针对日志做分析,首先所有的日志级别的日志都需要保存,其次error日志级别的日志需要单独做处理。这时就可以使用路由模式来处理了,声明交换机使用路由模式,每个日志级别的日志对应一个路由(error,info,warning)。声明一个保存日志队列用于接受所有日志,绑定交换机并绑定所有路由。声明第二个队列用于处理error级别日志,绑定交换机且只绑定error路由。以下是代码讲解。(先运行两个消费者,在运行生产者。如果没有提前将队列绑定到交换机,那么直接运行生产者的话,消息是不会发到任何队列里的

2、生产者(Send)代码

public class Send { //交换机名称 private final static String EXCHANGE_NAME = "test_exchange_direct"; //路由名称warning private final static String ROUTING_KEY_WARNING = "warning"; //路由名称info private final static String ROUTING_KEY_INFO = "info"; //路由名称error private final static String ROUTING_KEY_ERROR = "error"; public static void main(String[] args) { try { //获取连接 Connection connection = ConnectionUtil.getConnection(); //从连接中获取一个通道 Channel channel = connection.createChannel(); //声明交换机 channel.exchangeDeclare(EXCHANGE_NAME, "direct"); String message = "this is warning log"; //发送消息(warning级别日志) channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY_WARNING, null, message.getBytes("utf-8")); System.out.println("[send]:" + message); //发送消息(info级别日志) message = "this is info log"; channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY_INFO, null, message.getBytes("utf-8")); System.out.println("[send]:" + message); //发送消息(error级别日志) message = "this is error log"; channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY_ERROR, null, message.getBytes("utf-8")); System.out.println("[send]:" + message); channel.close(); connection.close(); } catch (IOException | TimeoutException e) { e.printStackTrace(); } } }

运行结果:

[send]:this is warning log
[send]:this is info log
[send]:this is error log

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwjjy.html