【问题标题】:Unable to create a Message selector in JMS properly无法在 JMS 中正确创建消息选择器
【发布时间】:2016-05-07 15:07:49
【问题描述】:

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

<?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?

附:我的应用是消费者,而不是消息的生产者。

【问题讨论】:

    标签: java jms activemq message-queue stomp


    【解决方案1】:

    正如链接到您的问题的文档中所解释的,JMS 选择器与 JMS 标准或用户属性一起使用...而不是消息负载的内容...

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

    【讨论】:

    • 如果您想根据“recordType”“选择”消息,您必须将“recordType”作为属性添加到您的消息中如何?鉴于“我的应用程序是消费者,而不是消息的生产者。”?
    • 在java中创建消息时:TextMessage msg = session.createTextMessage(); msg.setText(); msg.setJMSXXX(...) 设置 XXX JMS 标准属性:查看文档 msg.setStringProperty("recordType",); msg.setXXXProperty(,) ->设置int、long等属性JMS TutorialJMS Message API
    • 鉴于“我的应用是消费者,而不是消息的生产者”
    • 如果您无法更改生成 JMS 消息的方式来添加用户属性,那么您将无法使用 JMS 选择器,因为 JMS 选择器仅适用于 JMS 属性。您必须阅读每条消息并搜索有效负载以查找并提取您要查找的文本。也许 xml/xpath 是你的朋友。
    【解决方案2】:

    使用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 环境集成(没有强加容器要求),因此在您的应用程序中实现这一点应该没有问题。

    【讨论】:

      猜你喜欢
      • 2012-02-03
      • 2012-09-08
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2012-11-26
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多