无法正确在JMS中创建消息选择器

时间:2016-01-29 18:56:45

标签: java jms activemq message-queue stomp

我可以从服务器中检索一些如下所示的数据:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response>
    <responseMetadata>
        <httpCode>200</httpCode>
        <errorType>Ok</errorType>
        <description>Success</description>
        <cappingLimit>333</cappingLimit>
        <queryString>........</queryString>
    </responseMetadata>
    <responseHeader>
        <recordType>some record type long</recordType>
        <fileType>my_file_type</fileType>
    </responseHeader>
    <responseBody>
        <responseList>
            <item>
                <recordType>some record type short</recordType>
                <header2>fdsfdsfds</header2>
                <header3>fdsfdsssfds</header3>
                <header4>fdsfd2222sfds</header4>
            </item>

它还有推送STOMP服务。我希望能够通过它接收相同的数据。 但不是默认发送的所有数据,而只是具有

的数据

“recordType”=标题中的某些记录类型长,或者是正文中的“某些记录类型短”。不过,我认为不允许按身体过滤。

如何正确过滤它?我知道我必须使用

messageConsumer = session.createConsumer(topic, "recordType='some record type long'");


// or
messageConsumer = session.createConsumer(topic, "recordType='some record type short'"); // not allowed?

无论如何,这没有奏效。也许选择器错了?这里介绍了如何创建一个https://www-01.ibm.com/support/knowledgecenter/api/content/nl/en-us/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q031980_.htm#q031980_ 但是我应该如何在我的特定情况下创建它呢?什么是JMSType?

P.S。我的应用程序是消费者,而不是消息的制作者。

2 个答案:

答案 0 :(得分:1)

如链接到您的问题的文档中所述,JMS选择器使用JMS标准或用户属性 ...而不是消息有效负载的内容...

如果您想根据“recordType”“选择”消息,则必须将“recordType”添加为消息的属性

答案 1 :(得分:0)

使用Camel,您可以根据消息内容做出决策,并充当您能想到的任何事物的客户端,包括JMS代理,REST / SOAP Web服务提供者以及发送/接收纯HTTP请求。

在应用程序的Camel路由中,您可以根据您的情况筛选与特定XPath表达式(称为CBR,基于内容的路由)匹配的消息:

from("<source-endpoint>")
  .choice()
    .when(xpath("/response/responseHeader/recordType == ..."))
      .to("<destination-endpoint>")
    .otherwise()
      .log("skipping record ${exchangeId}");

由于Camel易于与任何Java环境集成(不需要容器要求),因此在应用程序中实现此功能应该没有问题。