我有一个Java方法,它将读取一些流变量,进行一些聚合并将结果附加到已存在于另一个流变量中的列表中。
因此,该方法需要MuleMessage。我认为显然可以使用MuleMessage
MEL变量将message
传递给java方法,如:
<invoke object-ref="Aggregator" method="aggregateSingle" methodArguments="#[message]" doc:name="Invoke"/>
但事实证明这会传递MessageContext
对象。但是我需要设置InvocationVariable
所以这个类没用。我知道我已经在变量中设置了变量,所以也许这会起作用(我想):
<invoke object-ref="Aggregator" method="aggregateSingle" methodArguments="#[groovy:message]" doc:name="Invoke"/>
但不,这会以某种方式传递payload
而不是MuleMessage
。
所以我发现这样做的唯一方法是在Groovy组件中实际调用它,如下所示。这意味着我每次都必须创建一个新的Aggregator对象,而不是按照我的计划使用spring:bean
。
<scripting:transformer doc:name="aggregateSingle">
<scripting:script engine="Groovy"><![CDATA[
new com.example.Aggregator().aggregateSingle(message);
message
]]></scripting:script>
</scripting:transformer>
是否无法使用MuleMessage
将invoke
对象传递给Java方法?
答案 0 :(得分:1)
默认情况下,mel使用消息上下文来引用消息变量,这实际上只是用于帮助解决常见的表达式,例如message.payload!= null(在mule的先前版本中,您必须检查null有效负载) 。我调试了invoke元素,遗憾的是没有表达式可以删除它,但这是一个可以使用的等效方法
<expression-transformer expression="#[groovy: Aggregator.aggregateSingle(message)]" />
这可以正常工作,因为groovy可以直接访问bean注册表,因此你可以引用bean名称并将其保存为spring bean(我想你想拥有)