【问题标题】:How to elegantly keep HTTP headers through a foreach mule loop?如何通过 foreach mule 循环优雅地保留 HTTP 标头?
【发布时间】:2018-05-22 04:48:58
【问题描述】:

在 Mule ESB 中,我尝试通过 foreach 循环转发自定义 HTTP 标头,而不将我的数据存储在会话变量中。

关于我的用例:我在 mule 中有 20 个不同的流,它们具有 HTTP 入站和 2 到 5 个 HTTP 出站。我正在尝试将大约 10 个 HTTP 标头从入站转发到所有出站。

我试图放置一个将入站变量复制到出站变量的私有流

<flow name="add_http_headers" doc:name="add headers">
    <message-properties-transformer scope="outbound">
        <add-message-property value="#[message.inboundProperties.X-HeaderName1]" key="X-HeaderName1"/>
    </message-properties-transformer>
</flow>

它可以正常工作,除了在一种情况下:http 出站标记位于 for-each 标记中:for-each 创建一个新上下文。出站和入站变量不再可访问。但我仍然可以访问会话变量。

因此我有一个补丁,但我对它不满意: 在我的 fore-each 之前,我在会话变量中转换所有标题

<message-properties-transformer  scope="session" >
    <add-message-property value="#[message.inboundProperties.X-HeaderName1]" key="X-HeaderName1"/>
</message-properties-transformer>

然后在我的 for-each 标记中,我将这些会话变量重新转换为出站变量:

<message-properties-transformer  scope="outbound" >
    <add-message-property value="#[sessionVars.X-defaultDistributor]" key="X-defaultDistributor"/>
</message-properties-transformer>

它有效,但我有很多重复,有没有一种方法可以限制重复和转发 http 标头,即使在创建新的 mule 上下文时也是如此?

【问题讨论】:

    标签: http mule


    【解决方案1】:

    对于那些可能仍然遇到这个问题的人(就像我一样),这里有一个替代选项。在 foreach 循环中,您仍然可以访问“rootMessage”变量中的原始标头,因此像这样的简单脚本可以将(全部或部分)这些标头传输到出站属性中:

    <scripting:component doc:name="Groovy">
          <scripting:script engine="Groovy"><![CDATA[
               rootMessage.getInboundPropertyNames().each{ inKey ->
                 if (rootMessage.getInboundProperty(inKey) != null) {
                    message.setOutboundProperty(inKey, rootMessage.getInboundProperty(inKey))
                 }
               }
             return payload; 
          ]]></scripting:script>
        </scripting:component>
    

    【讨论】:

      【解决方案2】:

      您可以使用一些流变量。 将所有内容放入会话变量中并不是一个好主意,因为 Mule 会将其传递给后续流程和虚拟机。它甚至将其作为序列化变量附加到 http 标头。因此,如果您的会话变得太大,您可能会在某些服务中遇到问题,因为标头太大而无法接受您的 http 请求。 您总是需要取消设置会话变量。有时你无法避免它,但通常我更喜欢 flowvars。 flowvar 的范围仅限于流或子流。因此,您无需担心取消设置它们或产生副作用,因为这些变量会跨越整个应用程序,通过每个 VM 和流或 Mule 尝试对其进行序列化。

      所以我最好的猜测是:使用 flowvars。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-03
        • 2012-07-01
        • 2015-10-27
        • 2015-12-05
        • 2017-01-27
        • 1970-01-01
        • 2013-03-24
        相关资源
        最近更新 更多