Mule表达式变量范围

时间:2014-04-25 13:03:57

标签: scope expression mule

Mule表达式组件中的变量范围是什么,以及它与流变量的关系如何?我有一个set-variable的流程,并惊讶地看到该值被expression-component中的赋值所覆盖。例如,

<flow name="HelloWorldFlow1" doc:name="HelloWorldFlow1">
    <http:inbound-endpoint exchange-pattern="request-response"
        host="localhost" port="9999" doc:name="HTTP"
        doc:description="This endpoint receives an HTTP message." path="helloworld"/>
    <set-variable variableName="asdf" value="firstvalue" doc:name="Variable"/>
    <logger message="#[flowVars[&quot;asdf&quot;]]" level="INFO" doc:name="Logger"/>
    <expression-component doc:name="Expression"><![CDATA[asdf = "secondvalue";]]></expression-component>
    <logger message="#[flowVars[&quot;asdf&quot;]]" level="INFO" doc:name="Logger"/>

    <expression-component doc:name="Expression"><![CDATA[qwer = "thirdvalue";]]></expression-component>
    <logger message="#[flowVars[&quot;qwer&quot;]]" level="INFO" doc:name="Logger"/>
</flow>

这个输出是:

INFO  2014-04-25 08:58:46,889 [[helloworld].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: firstvalue
INFO  2014-04-25 08:58:46,893 [[helloworld].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: secondvalue
INFO  2014-04-25 08:58:46,895 [[helloworld].connector.http.mule.default.receiver.02] org.mule.api.processor.LoggerMessageProcessor: null

如果可能的话,您能否指出范围规则的文档?我尝试了一些不同的搜索并不断获得无关的结果。

澄清:expression-component内,Mule是否首先检查是否存在具有给定名称的流变量,然后使用该变量而不是创建新变量?如果表达式组件创建变量,那么范围是否仅限于表达式组件代码?在http://blogs.mulesoft.org/mule-school-the-mulemessage-property-scopes-and-variables/中,它表示Mule流变量&#34;表现得像实例属性&#34;,但我无法找到实例属性的定义。 scope 一词也不在表达式组件参考页面(http://www.mulesoft.org/documentation/display/current/Expression+Component+Reference)中。

2 个答案:

答案 0 :(得分:7)

使用<set-variable,您可以创建流量变量。其范围在flow声明范围内,此流程也调用sub-flowsprivate flow。可以把它想象成一个实例变量。

此外,当您只显示3个日志语句的输出时,您的流程中有4个记录器语句。如果你修改log语句以包含你要打印的值,那么试图弄清楚print语句是针对哪个变量就不会产生混淆:

<logger message="Value of asdf is: #[flowVars['asdf']]" level="INFO" doc:name="Logger"/>

并且您不需要在变量名称周围&quot;。其他简写符号只是说

<logger message="Value of asdf is: #[asdf]" level="INFO" doc:name="Logger"/>

有关范围的更广泛参考,请参阅:http://blogs.mulesoft.org/mule-school-the-mulemessage-property-scopes-and-variables/

当您覆盖流中的变量值时,初始值将被下一个指定的值覆盖,就像java中的变量值赋值函数一样。

编辑:

您是对的,<set-variable>创建的变量可以使用表达式组件重新分配,但在<expression-component>内创建的变量不具有阻止范围。抱歉,我没有备份链接,这是基于我的实验。

答案 1 :(得分:0)

除了@Charu Khurana解释的内容之外,我可以在我们的应用程序中看到父流可以使用流变量。因此,如果您从父流(例如<flow-ref>)调用子流并在内部使用<set-variable>,您将可以访问父流中的这些变量。