On Wed, Oct 8, 2014 at 1:30 PM, Fraser Adams <fraser.ad...@blueyonder.co.uk> wrote:
> On 08/10/14 08:16, xavier wrote: > >> Hi Frase, >> >> Thanks for your explanation, but here, my code: >> >> In the requester: >> >> char * corrId; >> ..... >> ..... >> pn_bytes_t bytes = pn_bytes(correlationId.size(), corrId); >> pn_atom_t id; >> id.type = PN_STRING; >> id.u.as_bytes = bytes; >> pn_message_set_correlation_id(message, id); >> >> and after, send it >> pn_messenger_put(messengerProducer, message); >> >> I see on the broker, the correlationId is correctly setted, so no pb. >> >> after I wait the answer, but I would like (like JMS) only wake up on an >> answer at my question (and the correlationId is here to do that) >> >> in CMS >> >> MessageConsumer* consumer = session->createConsumer(destination, >> "JMSCorrelationID='" + correlationId + "'"); >> consumer->start(); >> >> But with qpid proton and messenger, if I do that: >> I get the response, and I does not accept it, if the correlationId >> recieve, >> is not the good one, but for me, it's not a good practice, because we >> retrieve the message (network traffic) in right case, but in wrong case >> too. >> >> So I would like to the same things like CMS, but.... how???? >> >> pn_selectable_t ?????????? >> pn_selector_t ???????????? >> >> Thank you >> >> Xav >> >> >> >> >> -- >> View this message in context: http://qpid.2158936.n2.nabble. >> com/CorrelationId-tp7614606p7614771.html >> Sent from the Apache Qpid Proton mailing list archive at Nabble.com. >> > > Re: > > MessageConsumer* consumer = session->createConsumer(destination, > "JMSCorrelationID='" + correlationId + "'"); > consumer->start(); > > That's exactly the bit that I've been trying to explain is the complicated > bit, and the bit that Robbie referred to in his previous reply. > > > In JMS and I guess with CMS that syntax means: > > > | MessageConsumer <http://docs.oracle.com/javaee/5/api/javax/jms/ > MessageConsumer.html>| > |*createConsumer <http://docs.oracle.com/javaee/5/api/javax/jms/ > Session.html#createConsumer%28javax.jms.Destination,% > 20java.lang.String,%20boolean%29>*(Destination <http://docs.oracle.com/ > javaee/5/api/javax/jms/Destination.html> destination, > String <http://java.sun.com/j2se/1.5/ > docs/api/java/lang/String.html> messageSelector, > boolean NoLocal)| > > > > Creates|MessageConsumer| for the specified destination, using a > message selector. > > > At an API level it's nice and simple, but there's a lot going on under the > hood and what it's doing is to pass information on the AMQP link attach (I > think) that configures a Message Selector (which is and AMQP filter > https://svn.apache.org/repos/asf/qpid/trunk/qpid/specs/ > apache-filters.xml#type-selector-filter). > > > Unfortunately (and I'd agree somewhat annoyingly!!) proton Messenger does > not yet support this type of sophistication when specifying subscriptions, > I wish it did myself, but unfortunately it currently does not :-( > > > > The stuff: > pn_selectable_t ?????????? > pn_selector_t ???????????? > > > Relates to something completely different I'm afraid those are actually > related to low level socket selectors (i.e. more related to the > select/poll/epoll system calls than Message Selectors). Their main use is > for replacing Messenger's internal network event loop so it can be more > easily integrated with other applications. > > I can't recall why you said you were using Messenger specifically, If you > can use C++ (rather than C) you might want to look at the qpid::messaging > API, you can definitely do the sort of thing that you want (e.g. using the > broker to perform filtering based on CorrelationID) using qpid::messaging. > The syntax is a little different in that I don't believe that there's a > particular overloaded createConsumer method call to set a selector and > you'd have to do it in the Address String - it'd look *something* like the > following (I think, I've not tried it YMMV) BTW if you haven't come across > it drain is a little qpid demo application that's really useful for trying > out Address Strings. So if you have a queue called queue1 this should > filter on messages with a given correlation ID. > > ./drain -b localhost -f \ > "queue1; {create: receiver, link: {name: test-link, selector: > \"correlation_id='<mycid>'\"}}" > > > That's the sort of syntax I'd like to see supported for Messenger > Subscriptions too (but as I say it currently isn't). > > I've copied my response to the qpid users mailing list, I tend to > recommend that people post questions there as it tends to have a broader > readership than the proton one. > > If you have to use C (as opposed to C++) then as I say Messenger won't do > what you want (though clearly you could do your own filtering inside your > consumer/server client), you could also get a bit more low-level and use > the Engine API, which will allow the sort of thing that you want > (qpid::messaging actually uses the proton Engine API under the hood), but > I'm afraid that I couldn't help you make any progress using Engine as I've > not got round to playing with that myself yet. > > Sorry I can't give you a simple answer to your question, hopefully my > explanation of the reasons why is better than it was previously. > > > In short: > * You can't currently do message selectors/filters with Messenger > * You can do this with JMS and qpid::messaging but the latter is C++ not C > * You can do it with the Engine API, but I couldn't tell you how to (if > you look in the qpid::messaging source you should get a good idea - that's > where I'd start) > Actually I think it is possible to do this with messenger now that dominic's patches are in. You can access the link associated with any given address using pn_messenger_get_link() and configure it however you want to. --Rafael