[rabbitmq-discuss] Query for Binding with similar topic routing keys returns all similar vs the one matching
Simon MacMullen
simon at rabbitmq.com
Thu Oct 13 14:30:27 BST 2011
On 12/10/11 15:48, Helena Edelson wrote:
> Matthias,
Hi Helena. I've figured out what's happening.
> Given the following precondition:
> Bindings exist that routing keys such as #.foo.bar and *.foo.bar would match.
> Where objOption is the Option returned from GET /api/bindings/vhost/e/exchange/q/queue/routingKey which unfortunately is either a binding or an array of bindings matching the #etc pattern
There are a couple of issues here. One is that the path should not be
/api/bindings/<vhost>/e/<exchange>/q/<queue>/<routing_key>, it's
/api/bindings/<vhost>/e/<exchange>/q/<queue>/<properties_key>, where
properties_key is a name for the binding the management plugin generates
from the routing key *and the arguments*. The properties key will often
look like the routing key in simple cases, but as soon as there are
arguments in the binding, or the routing key contains some special
characters, it will differ. This is all to get round the fact that
bindings don't have names, unlike everything else in AMQP.
You can see the properties key for a given binding when retrieving its
details from mgmt.
The other issue is that in general any names that are in the URI need to
be URI-escaped - in the same way as the vhost "/" needs to be referred
to as "%2F", since some characters that are valid in AMQP cannot appear
in URIs.
...and of course '#' is such a character - it marks the start of the
fragment in a URI, so when you request:
/api/bindings/vhost/e/exchange/q/queue/#.foo.bar
You're really asking for the document
"/api/bindings/vhost/e/exchange/q/queue/" (i.e. the list) and asserting
that you're going to look at the bit of it identified by ".foo.bar". I'm
not sure whether your HTTP client or Mochiweb / Webmachine strip the
fragment part out, but that's what's happening.
Anyway: tl;dr - use the properties key. If you need to generate such a
key then it has the form:
enc(routing_key) + "_" + enc(args_key_n) + "_" + enc(args_value_n) + "_"
+ enc(args_key_2) + "_" + enc(args_value_2) ... etc
where enc() means 'URI encode, additionally encoding "_" as "%5F"'.
Cheers, Simon
> Case 1: If I pass in binding pattern #.foo.bar, I get an array of Bindings
> Case 2: If I pass in binding pattern *.foo.bar, I consistently get a single matching Binding
>
> Here is what I am doing, in scala, where I want to extract one binding given one pattern (routing key).
>
> if (objOption.isDefined) objOption.get match {
>
> case bindings: Array[Binding] => for { b<- bindings if b.getRoutingKey == pattern } binding = b
>
> case b: Binding => binding = objOption.get.asInstanceOf[Binding]
> }
>
>
> Helena
> ________________________________________
> From: Matthias Radestock [matthias at rabbitmq.com]
> Sent: Wednesday, October 12, 2011 7:21 AM
> To: Helena Edelson
> Cc: rabbitmq-discuss at lists.rabbitmq.com
> Subject: Re: [rabbitmq-discuss] Query for Binding with similar topic routing keys returns all similar vs the one matching
>
> Helena,
>
> On 11/10/11 14:15, Helena Edelson wrote:
>> I found the user of the # character in the pattern of the binding,
>> given the number and type of binding patterns between queues and
>> exchanges, consistently returns multiple results vs the * character
>> which Rabbit can return a singular match. So I had to write a work
>> around :-)
>
> So do you think there is something broken there in rabbit? Or perhaps
> less obvious than it could be? If so, an example of the form "I tried X
> and was expecting to see Y but instead got Z" would help to shed light
> on the problem.
>
> Matthias.
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq-discuss at lists.rabbitmq.com
> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
--
Simon MacMullen
RabbitMQ, VMware
More information about the rabbitmq-discuss
mailing list