如何通过foreach mule循环优雅地保持HTTP标头?

时间:2014-08-28 08:50:26

标签: http mule

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

关于我的用例:我有20个不同的mule流,有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 outbound标记位于for-each标记中:for-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上下文?

2 个答案:

答案 0 :(得分:1)

对于那些可能仍然遇到此问题的人(正如我所做的那样),这里有一个替代选项。在foreach循环内部,你仍然可以在&#34; rootMessage&#34;中访问原始标题。变量,所以像这样的简单脚本可以将这些(全部或部分)转移到出站属性中:

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

答案 1 :(得分:0)

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

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