【问题标题】:Mule expression variable scopeMule 表达式变量范围
【发布时间】:2016-11-24 20:21:15
【问题描述】:

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 流变量“表现得像实例属性”,但我找不到实例属性的定义。 scope 一词也不在表达式组件参考页 (http://www.mulesoft.org/documentation/display/current/Expression+Component+Reference) 中。

【问题讨论】:

    标签: scope expression mule


    【解决方案1】:

    使用&lt;set-variable,您正在创建一个流变量。它的作用域在flow 内,它被声明并且sub-flowsprivate flow 被此流程调用。把它想象成一个实例变量。

    此外,您的流程中有 4 个记录器语句,而您只显示 3 个日志语句的输出。如果您修改日志语句以包含您正在打印的值,那么试图找出打印语句是针对哪个变量的混淆就会减少,例如:

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

    而且你不需要将&amp;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 中的变量赋值函数一样。

    编辑:

    你说得对,&lt;set-variable&gt; 创建的变量可以用表达式组件重新分配,但在 &lt;expression-component&gt; 内部创建的变量在该块之外没有范围。抱歉,我没有可备份的链接,这是基于我的实验。

    【讨论】:

    • 日志输出的错误数量是我的复制粘贴错误。我已将流程更新为不包含第三个记录器。
    • 我已经编辑了我的答案。不确定您是否打算在第三个记录器语句中打印qwer,它与您的问题有什么关系。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2013-08-03
      • 2017-07-07
      • 1970-01-01
      • 2015-08-14
      • 2016-06-22
      相关资源
      最近更新 更多