无法在 JMS 中正确创建消息选择器
Unable to create a Message selector in JMS properly
我可以从服务器检索一些数据,如下所示:
<?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" = header 中的一些记录类型 long 或者,body 中的 "some record type short" 是相同的。不过,我认为不允许按 body 过滤。
如何正确过滤它?我知道我必须使用
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。我的应用程序是消费者,而不是消息的生产者。
如链接到您的问题的文档中所述,JMS 选择器使用 JMS 标准或用户 属性...而不是消息有效负载的内容...
如果您想 "select" 基于 "recordType" 的消息,您必须将 "recordType" 作为 属性 添加到您的消息中
使用 Camel,您可以根据消息内容做出决定,并充当几乎所有您能想到的客户端,包括 JMS 代理、REST/SOAP Web 服务提供商和 send/receive 纯 HTTP 请求。
在应用程序的 Camel 路由中,您可以过滤与特定 XPath 表达式匹配的消息(称为 CBR,基于内容的路由),在您的情况下:
from("<source-endpoint>")
.choice()
.when(xpath("/response/responseHeader/recordType == ..."))
.to("<destination-endpoint>")
.otherwise()
.log("skipping record ${exchangeId}");
由于 Camel 很容易与任何 Java 环境集成(没有强加的容器要求),因此在您的应用程序中实现它应该没有问题。
我可以从服务器检索一些数据,如下所示:
<?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" = header 中的一些记录类型 long 或者,body 中的 "some record type short" 是相同的。不过,我认为不允许按 body 过滤。
如何正确过滤它?我知道我必须使用
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。我的应用程序是消费者,而不是消息的生产者。
如链接到您的问题的文档中所述,JMS 选择器使用 JMS 标准或用户 属性...而不是消息有效负载的内容...
如果您想 "select" 基于 "recordType" 的消息,您必须将 "recordType" 作为 属性 添加到您的消息中
使用 Camel,您可以根据消息内容做出决定,并充当几乎所有您能想到的客户端,包括 JMS 代理、REST/SOAP Web 服务提供商和 send/receive 纯 HTTP 请求。
在应用程序的 Camel 路由中,您可以过滤与特定 XPath 表达式匹配的消息(称为 CBR,基于内容的路由),在您的情况下:
from("<source-endpoint>")
.choice()
.when(xpath("/response/responseHeader/recordType == ..."))
.to("<destination-endpoint>")
.otherwise()
.log("skipping record ${exchangeId}");
由于 Camel 很容易与任何 Java 环境集成(没有强加的容器要求),因此在您的应用程序中实现它应该没有问题。