jmsListener selector mechanism for new solace bee's :)

while consuming solace messages with selector functionality from message header property, do not include any special characters in header key..
if in case if you are adding key with special character you may able to successfully send messages but while retrieving from queue/topic using jmsListener you may end-up with 400-Unresolved selector error.
eg:-
will not work because of '_' char:
selector = "custom_routing_header='${solace.jms.singletonconsumerservice.message.custom.header.value}'",

instead use
selector = "customroutingheader='${solace.jms.singletonconsumerservice.message.custom.header.value}'",

Tagged:

Comments

  • TomF
    TomF Member, Employee Posts: 412 Solace Employee

    Hey @maniv, thanks for that tip!

    To get the best performance out of PubSub+, it's best not to use selectors. They are an (effectively) unbounded compute problem. We have found that in the vast majority of cases, PubSub+'s dynamic, hierarchical topic structure can achieve the same filtering, simply put the header key in the topic:

    message/topic/100/apples/food
    header key number = 100
    header key fruit = apples
    header key type = food

    Now to select all apples I just subscribe to:
    message/topic//apples/

    To get all food when the number is between 110 and 119, I do:
    message/topic/11//food.

    To get all pears between 200 and 299 and 358 and 369, use multiple subscriptions:
    message/topic/2/pears/
    mesage/topic/358/pears/*
    mesage/topic/358/pears/*
    mesage/topic/36/pears/

    This means I can have multiple keys (up to 125!).

    This only really breaks down when you need a complicated range

  • maniv
    maniv Member Posts: 10

    @TomF thanks lot. let me have a try :)

  • Aaron
    Aaron Member, Administrator, Moderator, Employee Posts: 644 admin

    Hi @maniv . I know this is an old post, but I stumbled on it, and was wondering about it. You said that if you used the underscore _ character in the Selector identifier name, you received errors? I just tried that now using JCSMP and (Solace) JMS and it seemed to work fine. Can you confirm? Thanks!

  • RadovanB
    RadovanB Member Posts: 2

    Hi @TomF ,
    I'm trying to route messages in Camel. We consume messages from queues. I've found that I'm able to get the topic from the JmsDestination object.

    Is it possible to somehow set the topic pattern on the JMS uri ?

    Example of a queue consumer:
    <from uri="solace:queue:…ACKNOWLEDGEMENT/1.0/ACK/…/IN"/>
    The consumer receives topics in JmsDestination that have filtering keys in.

    I was thinking something like this could be done:
    <from uri="solace:queue:…ACKNOWLEDGEMENT/1.0/ACK/…/IN?topic=/my/favourite/*"/>
    This the consumer would consume only messages based on the pattern provided in the topic parameter.

    Thank you

  • TomF
    TomF Member, Employee Posts: 412 Solace Employee

    Hi RadovanB,

    I'm not a Camel expert, so I'll leave that part of the question to someone who knows more about that.

    However, I would say that you're going about things in an odd way. The broker does topic routing for you, so use that rather than Camel.

    What I mean by that is that rather than having a queue attract a range of topics and then have Camel route them, create queues with topic subscriptions to only the topics of interest. That way you won't need to know what the topic is in Camel, because you'll know that only those messages will be received from that queue.

  • RadovanB
    RadovanB Member Posts: 2

    I understand your point. Unfortunately I'm not in power to change anything in the Solace. I'm in the position of a consumer.

    Is there a possibility to setup a selector based on the topic name? I'm trying to figure how to setup multiple consumers on a one queue with different selectors. Otherwise I have to do the routing of messages in Camel. I try to avoid it as I have to resent messages based on the topic.

    Thank you,
    Radovan

  • TomF
    TomF Member, Employee Posts: 412 Solace Employee

    Ah. That's a tricky problem to solve. You can use selectors on header properties:

    "Any headers except JMSDestination, JMSExpiration and JMSReplyTo" according to https://timjansen.github.io/jarfiller/guide/jms/selectors.xhtml.

    So unfortunately, you can't use a selector on your destination/topic.

  • Aaron
    Aaron Member, Administrator, Moderator, Employee Posts: 644 admin

    https://docs.solace.com/API/API-Developer-Guide/Using-Selectors.htm

    Yup, unfortunately. But if the publisher could echo the topic into a User Property, then you'd be good to go.

    But that's not the best approach… what Tom said, let broker handle routing. Call your Solace admins and plead your case! 😅🙏🏼