我们正在将 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 中看到这种行为吗?
与 Java 类似 -Mule 是用 Java 开发的 - 变量和有效负载有效负载和流变量是对象引用。因此,当您将有效负载分配给变量时,两者都将引用同一对象实例。您的有效负载似乎是一张地图。如果您使用任一引用更改键的值,它们将访问同一对象。
DataWeave - 在两个 Mule 版本中 - 总是生成一个新的输出对象,因此引用会不同。