Escaping colon in JMS Selector - Apache ActiveMQ Apollo

342 Views Asked by At

I am using Apache Apollo -1.1 as my JMS broker.

Within that, I am trying to use a selector on a JMS Header, which contains colon in the value. The JMS header is as follows:

SYMBOL=USDGBP17MAYFUT::CDE

When I try to use the message selector

symbolSelector = "(SYMBOL='USDGBP17MAYFUT::CDE')"

OR

symbolSelector = "(SYMBOL LIKE 'USDGBP17MAYFUT!:!:CDE' ESCAPE '!')"

The correct message is not getting selected.

If I remove the colon from the symbol in the JMS header, and correspondingly in the symbolSelector, filtering works fine.

Please help me to use correct selector,as I need to have the symbol with a colon.

Update:

I tried the following as escape characters (based on Peter's inputs), but didn't work:

symbolSelector= "(SYMBOL LIKE 'USDINR17JUNFUT\\$:\\$:CDE_FO' ESCAPE '\\$')"

AND

symbolSelector= "(SYMBOL LIKE 'USDINR17JUNFUT\\!:\\!:CDE_FO' ESCAPE '\\!')"

But I keep on getting the exception:

org.fusesource.stomp.client.ProtocolException: Received an error: Invalid selector expression:  (MESSAGE_TYPE='REGISTER_REQUEST') AND (SYMBOL LIKE 'USDINR17JUNFUT\$:\$:CDE_FO' ESCAPE '\$')
javax.jms.JMSException: Received an error: Invalid selector expression:  (MESSAGE_TYPE='REGISTER_REQUEST') AND (SYMBOL LIKE 'USDINR17JUNFUT\$:\$:CDE_FO' ESCAPE '\$') 
    at org.fusesource.stomp.jms.StompJmsExceptionSupport.create(StompJmsExceptionSupport.java:59) ~[stompjms-client-1.18.jar:1.18]
    at org.fusesource.stomp.jms.StompChannel.subscribe(StompChannel.java:257) ~[stompjms-client-1.18.jar:1.18]
    at org.fusesource.stomp.jms.StompJmsSession.add(StompJmsSession.java:608) ~[stompjms-client-1.18.jar:1.18]
    at org.fusesource.stomp.jms.StompJmsMessageConsumer.init(StompJmsMessageConsumer.java:67) ~[stompjms-client-1.18.jar:1.18]
    at org.fusesource.stomp.jms.StompJmsSession.createConsumer(StompJmsSession.java:223) ~[stompjms-client-1.18.jar:1.18]
    at com.edelweiss.libs.AnalyticsJMSPubSub.consumer.GenericJMSConsumer.<init>(GenericJMSConsumer.java:53) [AnalyticsJMSPubSub-0.0.1-SNAPSHOT.jar:?]
    at com.edelweiss.algo.tmp.JMSPubSub.App.main(App.java:43) [classes/:?]
Caused by: org.fusesource.stomp.client.ProtocolException: Received an error: Invalid selector expression:  (MESSAGE_TYPE='REGISTER_REQUEST') AND (SYMBOL LIKE 'USDINR17JUNFUT\$:\$:CDE_FO' ESCAPE '\$')
at org.fusesource.stomp.client.CallbackConnection.processStompFrame(CallbackConnection.java:110) ~[stompjms-client-1.18.jar:1.18]
    at org.fusesource.stomp.client.CallbackConnection.access$000(CallbackConnection.java:33) ~[stompjms-client-1.18.jar:1.18]
    at org.fusesource.stomp.client.CallbackConnection$1.onTransportCommand(CallbackConnection.java:61) ~[stompjms-client-1.18.jar:1.18]
    at org.fusesource.hawtdispatch.transport.TcpTransport.drainInbound(TcpTransport.java:664) ~[hawtdispatch-transport-1.18.jar:1.18]
    at org.fusesource.hawtdispatch.transport.TcpTransport$6.run(TcpTransport.java:543) ~[hawtdispatch-transport-1.18.jar:1.18]
    at org.fusesource.hawtdispatch.internal.NioDispatchSource$3.run(NioDispatchSource.java:209) ~[hawtdispatch-1.18.jar:1.18]
    at org.fusesource.hawtdispatch.internal.SerialDispatchQueue.run(SerialDispatchQueue.java:100) ~[hawtdispatch-1.18.jar:1.18]
    at org.fusesource.hawtdispatch.internal.pool.SimpleThread.run(SimpleThread.java:77) ~[hawtdispatch-1.18.jar:1.18]

    at org.fusesource.stomp.client.CallbackConnection.processStompFrame(CallbackConnection.java:110)
    at org.fusesource.stomp.client.CallbackConnection.access$000(CallbackConnection.java:33)
    at org.fusesource.stomp.client.CallbackConnection$1.onTransportCommand(CallbackConnection.java:61)
    at org.fusesource.hawtdispatch.transport.TcpTransport.drainInbound(TcpTransport.java:664)
    at org.fusesource.hawtdispatch.transport.TcpTransport$6.run(TcpTransport.java:543)
    at org.fusesource.hawtdispatch.internal.NioDispatchSource$3.run(NioDispatchSource.java:209)
    at org.fusesource.hawtdispatch.internal.SerialDispatchQueue.run(SerialDispatchQueue.java:100)
    at org.fusesource.hawtdispatch.internal.pool.SimpleThread.run(SimpleThread.java:77)
1

There are 1 best solutions below

3
On

First things first - Apache Apollo 1.1 is a very early version of a now discontinued product. I would look at upgrade it when facing issues.

Anyway, selectors with colons works just like any other selector. Both statements above work without issues using a ActiveMQ 5.8/OpenWire v8 JMS client with Apollo 1.1 broker. It must be something else.

Test command to consume a msg with selector. Escape of ! is for zsh, not Java/JMS.

➜  target git:(master) ✗ java -jar a.jar -b tcp://localhost:61613 -U admin -P password --get --selector "(SYMBOL LIKE 'USDGBP17MAYFUT\!:\!:CDE' ESCAPE '\!')" TEST.QUEUE
-----------------
Message Properties
  SYMBOL: USDGBP17MAYFUT::CDE
Payload:
  msg
Operation completed in 23ms (excluding connect)