On 15/02/14 21:11, Robbie Gemmell wrote:
On 14 February 2014 09:20, Fraser Adams <[email protected]>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 <qpid>/cpp/src/qpid/broker/amqp/Message.cpp

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 properties.

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 properties.

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
user-id
to
subject
reply-to
content-type
content-encoding
group-id
group-sequence
reply-to-group-id

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
amqp.user_id
amqp.subject
amqp.content_type
amqp.content_encoding

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 addition.




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.

Cheers,
Frase



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to