在JMS选择器中转义冒号--Apache ActiveMQ Apollo

时间:2017-05-29 14:46:20

标签: jms activemq ansi-sql-92

我使用Apache Apollo -1.1作为我的JMS代理。

在其中,我试图在JMS标题上使用选择器,它在值中包含冒号。 JMS头如下:

SYMBOL=USDGBP17MAYFUT::CDE

当我尝试使用消息选择器

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

OR

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

未选择正确的讯息。

如果我从JMS标题中的符号中删除冒号,并且相应地在symbolSelector中删除,则过滤工作正常。

请帮我使用正确的选择器,因为我需要带有冒号的符号。

更新

我尝试了以下作为转义字符(基于彼得的输入),但没有工作:

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

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

但我继续得到例外:

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 个答案:

答案 0 :(得分:0)

首先,Apache Apollo 1.1是现已停产的产品的早期版本。面对问题,我会考虑升级它。

无论如何,带冒号的选择器就像任何其他选择器一样。上面的两个语句在使用带有Apollo 1.1代理的ActiveMQ 5.8 / OpenWire v8 JMS客户端时都没有问题。它必须是别的东西。

测试命令以使用带选择器的msg。逃脱!适用于zsh,而不是Java / JMS。

for(int a=0, b=5 ; a<=5 ; a++,b--){
    // do your stuff here
}