JMS 选择器,用于在带有 Camel 和蓝图的一个标头中具有下划线的消息

Posted

技术标签:

【中文标题】JMS 选择器,用于在带有 Camel 和蓝图的一个标头中具有下划线的消息【英文标题】:JMS Selector for messages having an underscore in one header with Camel and Blueprint 【发布时间】:2017-05-25 13:40:28 【问题描述】:

我需要清理 JMS 队列 (ActiveMQ) 中的一些消息,其中一些消息头包含下划线。

一些例子

Message 1: 
    header MyObject=urn:sap:order:ID1234
    body = <some xml>


Message 2: 
    header MyObject=urn:sap:order:ID9834_ABC
    body = <some xml>

我的目标是从原始队列 @9​​87654328@ 中移动唯一看起来像 Message 2(以及所有类似的包含下划线)的消息,而不是不带下划线的消息(如 Message 1)。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
    xsi:schemaLocation="
       http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
       http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd
       http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd">

    <cm:property-placeholder persistent-id="com.mycompany.order-temp" update-strategy="reload">
        <cm:default-properties>
            <cm:property name="amq.url" value="tcp://localhost:61616" />
            <cm:property name="queue.to.dump" value="activemq:queue:MY_ORDERS?selector=MyObject+LIKE+'urn:order:%&#95;%'" />
        </cm:default-properties>
    </cm:property-placeholder>
    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <onException useOriginalMessage="true">
            <exception>java.lang.Exception</exception>
            <handled>
                <constant>true</constant>
            </handled>
            <to uri="activemq:queue:MY_ORDERS_DLQ?preserveMessageQos=true" />
        </onException>
        <route id="route-orders-to-temp">
            <from uri="queue.to.dump" />
            <to uri="activemq:queue:MY_ORDERS_TEMP" />
        </route>
    </camelContext>
    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
        <property name="brokerURL" value="$amq.url" />
    </bean>
</blueprint>

通过使用以下帖子,并且因为关于选择器的官方ActiveMQ Documentation 说它使用SQL 92 syntax

https://***.com/a/17102616/628006 https://***.com/a/5822/628006

我尝试了以下所有组合:

selector=MyObject+LIKE+'urn:sap:order:%&#95;%'
selector=MyObject+LIKE+'urn:sap:order:%_%'
selector=MyObject+LIKE+'urn:sap:order:%\_%'
selector=MyObject+LIKE+'urn:sap:order:%[_]%'
selector=MyObject+LIKE+'urn:sap:order:[a-Z0-9]*_[a-Z0-9]*'

但它们似乎都不起作用。有什么想法吗?

【问题讨论】:

【参考方案1】:

最后我找到了我的问题的解决方案:有一种特殊的语法来定义转义字符,这似乎不是默认设置的。

通过查看互联网,我终于找到了following post,它清楚地表明下划线必须通过例如转义。 \ 然后用 ESCAPE '\' 定义转义字符

如果我将以下几行应用于我的案件:

selector=MyObject+LIKE+'urn:sap:order:%&#95;%' ESCAPE '\'
selector=MyObject+LIKE+'urn:sap:order:%\_%' ESCAPE '\'

与选择器末尾的附加 ESCAPE '\' 配合使用即可。

【讨论】:

以上是关于JMS 选择器,用于在带有 Camel 和蓝图的一个标头中具有下划线的消息的主要内容,如果未能解决你的问题,请参考以下文章

Camel 和 JMS 以正确的顺序从高级队列中消费消息

为什么Aries Blueprint没有为camel-cxf和camel-blueprint注册名称空间处理程序?

如何在 Apache Camel 中检测损坏/恢复的 JMS 连接?

如何使用 Apache Camel 从 Java 类访问 JMS 队列?

如何从蓝图动态设置HTTP方法(Camel-http)

在基于Apache Camel蓝图的OSGi包中检测到重复的ServletName