【问题标题】:Camel JMS - Unable to set JMSPriority to IBM MQ MessageCamel JMS - 无法将 JMSPriority 设置为 IBM MQ 消息
【发布时间】:2016-04-04 09:50:25
【问题描述】:

我们正在尝试使用 Apache Camel 通过 IBM mq 发送 JMS 文本消息。除了 JMSPriority 之外,我们可以设置几个 JMS 标头属性。我们尝试设置 int 值并使用 resultType="java.lang.Integer" 但无法更改优先级。任何线索都会很有帮助。

 <route id="mqSender">
                 <from uri="direct:mqSender"></from>
                 <filter>
                       <simple> ${body} != null</simple>
                       <setProperty propertyName="originalRequest">
                              <simple> ${body}</simple>
                       </setProperty>
                       <setHeader headerName="JMSCorrelationID">
                              <simple>${body.messageContextVO.requestID}</simple>
                       </setHeader>
                       <setHeader headerName="VersionId">
                              <simple>${body.metadata["VersionId"]}</simple>
                       </setHeader>
                       <setHeader headerName="FunctionId">
                              <simple>${body.metadata["FunctionId"]}</simple>
                       </setHeader>
                       <setHeader headerName="Format">
                              <simple>${body.metadata["Format"]}</simple>
                       </setHeader>
                       <choice>
                              <when>
                                     <simple>${property.originalRequest.metadata["FetchPriorityValue"]}== "true"</simple>
                                     <transform>
                                            <simple>${body.formattedData}</simple>
                                     </transform>
                                     <setHeader headerName="JMSPriority">
                                           <simple> ${property.originalRequest.priority}</simple>
                                     </setHeader>

                                     <camel:setHeader headerName="CamelJmsDestinationName"><simple>queue:///${property.originalRequest.metadata["queueName"]}?targetClient=1</simple></camel:setHeader>

                              </when>
                       </choice>
                      <log message="${property.originalRequest.metadata[queueName]}"></log>
                       <recipientList>
                              <simple>wmq:queue:${property.originalRequest.metadata["queueName"]}?exchangePattern=InOnly</simple>
                       </recipientList>
                       <transform>
                              <simple>${property.originalRequest}</simple>
                       </transform>
                 </filter>
                 <!-- <to uri="bean:trackerUpdateProcessor?method=process" /> -->
          </route>

【问题讨论】:

    标签: apache-camel ibm-mq


    【解决方案1】:

    我们找到了让它发挥作用的解决方案。需要在标头 CamelJmsDestinationName 处设置优先级属性 即,

    <camel:setHeader headerName="CamelJmsDestinationName"><simple>queue:///${property.originalRequest.metadata["queueName"]}?targetClient=1&amp;priority=${dynamicValue}</simple></camel:setHeader>
    

    发送方代码在本地代码中检查 MQ 目标级别的优先级值。 TimeToLive 和 Priority 值需要在 MQ 目标级别设置才能与 Camel 一起使用。

    【讨论】:

    • 您是否尝试在目标设置上仅设置 targetClient=1 并使用 QoS 的端点设置?
    • 是的,但没有成功。与此同时,设置优先级属性也成功了。
    【解决方案2】:

    我不确定 wmq,但对于普通 jms 组件(我相信骆驼 wmq 的行为相同)为特定消息端点配置设置 JMSPriority 必须将选项“preserveMessageQos”设置为 true

    如果要使用消息上指定的 QoS 设置而不是 JMS 端点上的 QoS 设置发送消息,则设置为 true。以下三个标头被认为是 JMSPriority、JMSDeliveryMode 和 JMSExpiration。您可以提供全部或仅提供其中的一部分。如果未提供,Camel 将转而使用来自端点的值。因此,使用此选项时,标头会覆盖端点中的值。相比之下,explicitQosEnabled 选项将仅使用在端点上设置的选项,而不使用消息头中的值。

    【讨论】:

    • 我们尝试启用 preserveQoS 。在调试时,我们发现即使是 Camel 也将这些值设置为 JMS 消息,本机 mq 代码会覆盖这些值并在其中进行检查。
    • 这个解决方案对我有用。在 JMS 客户端级别设置 endPoint 上的 preserveMessageQos=true 可以保留和配置 JMSPriority。在所有消息之前,即使我在消息头中设置值,也将 JMSPriority 设置为 4。现在默认情况下优先级为 0,除非您专门将标头值设置为您希望的值。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多