String queue = channel.queueDeclare("test.queue").getQueue(); Rabbitmq Server 会有以下操作: - 把queue的名称(test.queue)作为routingKey,将当前这个queue binding到一个默认的exchange(名称为空,服务器自动创建的)上
如果我们 binding的话
channel.queueBind("test.queue", "test.exchange", "test.routingkey"); 上边和默认的Exchange进行的binding还是会存在的 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); // RabbitMQ默认有一个exchange,叫default exchange,它用一个空字符串表示,它是direct exchange类型 // ,任何发往这个exchange的消息都会被路由到routing key的名字对应的队列上,如果没有对应的队列,则消息会被丢弃 // 。这就是为什么代码中channel执行basicPulish方法时,第二个参数本应该为routing key,却被写上了QUEUE_NAME。
经过同事lucas多次测试发现,以前认为RoutingKey是唯一的或由Exchange和RoutingKey决定一条唯一的由Exchange到Queue的线路是不正确的 测试结果如下:
Exchange Name | Queue Name | Routing Key | | test.queue | test.queue | | test.queue2 | test.queue2 | test.exchange | test.queue | test.routingkey | test.exchange | test.queue2 | test.routingkey | test.exchange | test.queue | test.routingkey2 | test.exchange1 | test.queue | test.routingkey |
由结果可以看出,由Exchange,Queue,RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。 画张图,不是很准确
|