Mule 3 与 Mule 4 - 负载是不可变的吗?

问题描述 投票:0回答:1

我们正在将 Mule 3 api 迁移到 Mule 4,并观察到一些在 Mule 3 中无法理解的行为......

我们有来自 HTTP 端点的传入负载

{
   empId: 10,
   empAge: 23,
   empName: "Xyz",
   bonus: "N",
   performance: "Good",
   reward: "N" 
}

我们将其存储在变量中:

<set-variable variableName="originalPayload" value="#[payload]" doc:name="Store original payload"/>

然后我们有一个 Groovy 组件,它正在执行一些奖励逻辑:

<scripting:script engine="Groovy"><![CDATA[
if (flowVars.originalPayload.empAge > 20) {
    flowVars.originalPayload.put("bonus", "Y")
}
return payload]]>
</scripting:script>
</scripting:component>

在这里我可以看到“奖金”现在在

originalPayload
(预期)和
payload
(非预期)中都设置为“Y”

上述情况发生在Groovy组件执行后。

进一步进入流程 - 我们正在使用

expression component
:

<expression-component doc:name="Set reward">
<![CDATA[if (payload.performance == "Good")  { payload.reward = "Y" }]]>
</expression-component>

代码也执行上述表达式之后

reward
现在在有效负载(预期)和i中都反映为“Y”
flowVars.originalPayload
(非预期)

在 Mule 4 中,我用 Dataweave 转换组件替换 Groovy 和表达式,对

bonus
所做的更改仅反映在
originalPayload 
中(预期),但不反映在
payload
中 。同样,Mule 4 中的
reward
现在仅在
payload
中反映为“Y”(预期),而不是在
vars.originalPayload

中反映为“Y”

所以简而言之,Mule 4 的行为有意义,但 Mule 3 的行为则不然。

有人可以解释一下为什么我们在 Mule 3 中看到这种行为吗?

groovy mule mulesoft mule4
1个回答
0
投票

与 Java 类似 -Mule 是用 Java 开发的 - 变量和有效负载有效负载和流变量是对象引用。因此,当您将有效负载分配给变量时,两者都将引用同一对象实例。您的有效负载似乎是一张地图。如果您使用任一引用更改键的值,它们将访问同一对象。

DataWeave - 在两个 Mule 版本中 - 总是生成一个新的输出对象,因此引用会不同。

© www.soinside.com 2019 - 2024. All rights reserved.