qpid-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Fraser Adams <fraser.ad...@blueyonder.co.uk>
Subject Visibility of amqp subject to Message Selectors - was Re: Message API - Real world usage issue
Date Sun, 16 Feb 2014 09:25:11 GMT
On 15/02/14 21:11, Robbie Gemmell wrote:
> On 14 February 2014 09:20, Fraser Adams <fraser.adams@blueyonder.co.uk>wrote:
>> The message reported by drain says:
>> Message(properties={spout-id:88fc4a67-d71e-4b86-b967-f897306400e7:0},
>> subject='tim', content='Hello World')
>> So *something* thinks that there's a subject property set, but the
>> selector doesn't seem to see it.
> I expect that means the 'subject' field of the 'properties' section of the
> AMQP message is set, and not a 'property' called 'subject' in the
> 'application-properties' section (which is where the spout-id property is
> presumably being set).
Thanks Robbie, yeah this had started to dawn on me yesterday. I was 
looking through the C++ broker code and noticed in 

std::string Message::getRoutingKey() const
     std::string v;
     v.assign(subject.data, subject.size);
     return v;

which seems to be the only place where subject gets exposed - so it's in 
a specific accessor not a general property one, then I remembered that 
AMQP 1.0 has immutable properties in section 3.2.4 and application 
properties in 3.2.5 and remembered that subject is one of the 3.2.4 

in <qpid>/qpid-trunk/qpid/specs/apache-filters.xml it explains about 
mapping the JMS headers and most of the JMS headers relate to 3.2.4 

What I think is happening is that in AMQP 1.0 qpid::messaging used by 
spout actually populates the AMQP 1.0 subject field correctly with the 
subject, but when specifying subject in the Selector that's looking for 
an *application property* called "subject". That'll be why the AMQP 0.10 
thing works because the legacy "qpid.subject" actually *is* an 
application property.

In <qpid>/cpp/src/qpid/broker/Selector.cpp there's a method:
const Value MessageSelectorEnv::specialValue(const string& id) const

That does the mappings mentioned in the apache-filters.xml

the method

const Value& MessageSelectorEnv::value(const string& identifier) const

Checks for the prefix "amqp." and if set calls specialValue() otherwise 
it looks up the application properties.

Of the AMQP 1.0 section 3.2.4 properties it looks like

Don't have any accessor in the Selector (though to and reply-to have a 
comment "Hard to get this correct for both 1.0 and 0-10" though it might 
be worth exposing them as a LIKE operator might help abstract the 
differences) the group-id, group-sequence and reply-to-group-id don't 
even appear to be extracted in Message.cpp from what I can see.

Anyway I'd *imagine* that it wouldn't be terribly hard to expand the 
pattern used for the JMS Headers to allow access to some of these e.g. 
Selector keys of

Would make them visible to specialValue() where they could be added to 
the if/else block and their specific accessors could then be called.

I don't know if there is any specific reason for not doing this other 
than the original goal being to map JMS Message Selectors.

 From my responses to Clive it would seem to suggest that subject at 
least would be really useful to be exposed to a Selector especially as 
it's a core routing attribute for other filter types.

I'd be interested to know what others think - it looks a fairly simple 

>> Does anybody know how to specify the message subject as a property for a
>> Message Selector in AMQP 1.0???
> As the filter in question is specifically only covering functionality
> required for JMS (specifically mapping the JMS Headers to the relevant
> fields in the AMQP headers and properties sections, and JMS properties to
> the AMQP application-properties section) its not clear to me that it allows
> for selection of the 'subject' field in the 'properties' section, because
> that isn't used to map any of the JMS headers or property values and so
> effectively isn't discussed.
> [snip]
Yeah as mentioned above that looks about right. I've not looked in the 
Java Broker Selector code, but I imagine that it does something similar 
to the C++ code and looks for the "amqp." prefix but only covers the 
3.2.4 properties mentioned in apache-filters.xml.

To my mind it doesn't seem unreasonable to extend this to subject (at 
least) given that it's a key filtering property for other filters, but 
it's probably worth a discussion.


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

View raw message