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

//声明直连交换器

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关键字类型的消息。






评论

© dzxlovelar | Powered by LOFTER