RabbitMq学习笔记(四)—— 消息路由(Routing)

来源:互联网 发布:nginx代理apache 400 编辑:程序博客网 时间:2024/06/04 17:48
//声明直连交换器channel.exchangeDeclare(EXCHANGE_NAME, "direct");  // 获取匿名队列名称  String queueName = channel.queueDeclare().getQueue();根据路由关键字进行多重绑定 for(String severity :routingKeys){          channel.queueBind(queueName, EXCHANGE_NAME, severity);  } //消费数据Consumer consumer = new DefaultConsumer(channel) {              @Override              public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {                  String message = new String(body, "UTF-8");                  System.out.println(" [x] Received '" + envelope.getRoutingKey() + "':'" + message + "'");              }    };          channel.basicConsume(queueName, true, consumer);

直连类型交换器

上一章的例子是通过分发【fanout】类型的交换器【logs】广播日志信息,现在我们将日志分debug、info、warn、error这几种基本的级别,实际在生产环境中,避免磁盘空间浪费,应用只会将error级别的日志打印出来。而分发【fanout】类型的交换器会将所有基本的日志都发送出来,如果我们想只接收某一级别的日志信息,就需要使用直连【direct】类型的交换器了, 下面的图中,队列1通过ERROR这个routingkey绑定到E交换器,队列2通过WARN和INFO绑定到E交换器,E交换器的类型是直连【direct】的,如果生产者【P】发出ERROR的日志,只会有队列1会收到,如果生产者【P】发出INFO和WARN的日志,只有队列2会收到,如果生产者【P】发出DEBUG级别的日志,队列1和队列2都会忽略它。

多重绑定

我们允许多个队列以相同的路由关键字绑定到同一个交换器中,可以看到,交换器虽然是直连类型,但是绑定后的效果却跟分发类型的交换器类似,相同的是队列1和队列2都会收到同一条来自交换器的消息。

他们的区别:分发模式下,队列1、队列2会收到所有级别(除ERROR级别以外)的消息,而直连模式下,他们仅仅只会收到ERROR关键字类型的消息。

0 0
原创粉丝点击