在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上下文?
答案 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。