You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@qpid.apache.org by Fraser Adams <fr...@blueyonder.co.uk> on 2014/03/01 13:33:39 UTC

Re: Create a header exchange

On 28/02/14 21:51, Crinklaw-Vogt, Matthew wrote:
> I was curious how to create a header exchange via an address string.
>
> Doing something like:
> `test_header_ex; {create: always, node: {type: headers}}`
>
> appears to be invalid as the only valid node types are "topic" and "queue."  Is there some other way to create a header exchange via an address string?
>
> -Matt
>
Hi Matt,
The "subtle little nuance" here is that when talking about node types in 
this context it's *really* meaning the semantic type of the AMQP node 
and not the explicit type of an exchange.

What I mean by that is that if you think about messaging patterns there 
are two main types
1) Point to Point
2) Publish/Subscribe

If you are familiar with JMS that has Destination types of Queue and 
Topic and it is in that sense of topic that the node type is labelled, 
so a queue node is fairly obviously a queue but (most) exchange nodes 
(aside I guess from direct exchanges) behave in a pub/sub like way.

The most obvious example would be amq.topic but amq.match, xml and 
amq.fanout are semantically quite similar albeit with different message 
selection mechanisms.


To answer your question, what you need to include is some additional 
information, namely the topic type. The following does what I think you 
are expecting:

./drain -b localhost -f \
"test_header_ex; {create: always, node: {type: topic, x-declare: {type: 
headers}}}"

If you want to get a bit fancier here's a way to make it auto delete:

./drain -b localhost -f \
"test_header_ex; {create: always, node: {type: topic, x-declare: {type: 
headers, auto-delete: true}}}"


The following example exercises pretty much every exchange option 
(though auto delete and durable is probably a bonkers combination) this 
sets an alternate exchange and makes it an Initial Value Exchange with 
sequence numbering enabled (I don't tend to use those myself but thought 
you might be interested in the syntax).

./drain -b localhost -f \
"test_header_ex; {create: always, node: {type: topic, durable: true, 
x-declare: {type: headers, auto-delete: true, alternate-exchange: 
'amq.match', arguments: {'qpid.ive': 1, 'qpid.msg_sequence': 1}}}}"




One thing that's worth pointing out is that the x-declare stuff is 
protocol specific (i.e. AMQP 0.10 specific) though as it happens I tried 
this using AMQP 1.0 and found the following works (but see my note below):

./drain --connection-options {protocol:amqp1.0} -b localhost -f \
"test_header_ex; {create: always, node: {type: topic, x-declare: {type: 
headers, auto-delete: true}}}"


though I think that the following equivalent address is a bit more 
idiomatic:

./drain --connection-options {protocol:amqp1.0} -b localhost -f \
"test_header_ex; {create: always, node: {type: topic, properties: 
{exchange-type: headers, auto-delete: true}}}"



One other important thing to note about AMQP 1.0 is that (quoted from 
Gordon Sim)
"
* The 'create' option in qpid::messaging addresses

Using this option with an explicit node name results in non-standard 
AMQP and is discouraged where it can be avoided. A better alternative is 
to configure node policies. These are patterns that an attaching links 
address are checked against if it doesn't resolve to any existing node. 
If a matching pattern is found, the node will be auto-created with the 
properties of that policy.
"


So basically the AMQP 1.0 examples that I illustrated above are actually 
*non-standard AMQP*. I'm afraid that I'm somewhat unfamiliar with the 
work around "A better alternative is to configure node policies" but the 
following approach seems to work:

Firstly you need to add a TopicPolicy Management Object to the broker. 
I'm not exactly sure when this feature was added (it was October 2013, 
but I can't recall which Qpid version - I'm using 0.27 on Qpid trunk)

qpid-config add TopicPolicy header-exchange-* --argument 
exchange-type=headers --argument auto-delete=false --argument 
alternate-exchange=amq.match --argument qpid.ive=1 --argument 
qpid.msg_sequence=1

You can check what was added using:

qpid-config list TopicPolicy


Now if we specify the following address what it does is to check the 
address against an existing node and if one exists attaches to that, but 
if not it checks the policy patterns and if a match is found it will 
auto-create a node with the properties of that policy (I've not checked 
to see if the IVE stuff actually works doing this, but the properties do 
seem to be added to the created exchange so it *probably* works).

./drain --connection-options {protocol:amqp1.0} -b localhost -f 
"header-exchange-test"

You can delete a TopicPolicy as follows

qpid-config del TopicPolicy header-exchange-*


The TopicPolicy/QueuePolicy stuff is qpidd specific (other brokers may 
have analogous features) but it does allow the use of a standard AMQP 
1.0 address.


Hopefully that's given you a fairly comprehensive answer to your 
question :-)

If you want to get really flashy here's an AMQP 1.0 address that 
dynamically creates an exchange as above, but it also creates a 
subscription queue called "test-link" with bindings that match on 
message properties data-service=amqp-delivery item-owner=fadams

./drain --connection-options {protocol:amqp1.0} -b localhost -f \
"header-exchange-test; {node: {capabilities: [shared]}, link: {name: 
test-link, filter: {name: key, descriptor: 
'apache.org:legacy-amqp-headers-binding:map', value: {x-match: all, 
data-service: amqp-delivery, item-owner: fadams}}}}"


Finally it's worth bearing in mind that even though I've explained a bit 
about how to make the general topic creation standard in AMQP 1.0 the 
filter stuff, although a registered AMQP 1.0 extension, is unlikely to 
be implemented in non-Qpid Brokers, so you'd probably want to use 
message selectors if you wanted to give your address more portability.

HTH,
Frase


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@qpid.apache.org
For additional commands, e-mail: users-help@qpid.apache.org