使用Mule调用将MuleMessage传递给Java方法

rew*_*olf 6 java mule

我有一个Java方法,它将读取一些流变量,进行一些聚合并将结果附加到已存在于另一个流变量中的列表中.

因此,该方法需要MuleMessage.我认为显然可以MuleMessage使用messageMEL变量传递给java方法,如:

<invoke object-ref="Aggregator" method="aggregateSingle" methodArguments="#[message]" doc:name="Invoke"/>
Run Code Online (Sandbox Code Playgroud)

但事实证明,这会传递一个MessageContext对象.但是我需要设置InvocationVariable这样这个类没用.我知道我已经在groovy中设置了变量,所以也许这会起作用(我想):

<invoke object-ref="Aggregator" method="aggregateSingle" methodArguments="#[groovy:message]" doc:name="Invoke"/>
Run Code Online (Sandbox Code Playgroud)

但不,这不知何故通过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> 
Run Code Online (Sandbox Code Playgroud)

有没有办法将MuleMessage对象传递给Java方法使用invoke

Jua*_*tti 1

默认情况下,mel 使用消息上下文来引用消息变量,这实际上只是为了帮助处理常见表达式,例如 message.payload != null (在以前版本的 mule 中,您必须检查 null 有效负载)。我已经调试了调用元素,不幸的是没有表达式会剪切它,但这是您可以使用的等效方法

<expression-transformer expression="#[groovy: Aggregator.aggregateSingle(message)]" />
Run Code Online (Sandbox Code Playgroud)

这按预期工作,因为 groovy 可以直接访问 bean 注册表,因此您可以引用 bean 名称并将其保留为 spring bean(正如我想象的那样)