【发布时间】:2015-07-08 05:50:22
【问题描述】:
我有一个 Java 方法,它将读取一些流变量,进行一些聚合并将结果附加到另一个流变量中已经存在的列表中。
因此,该方法需要一个 MuleMessage。我认为显然可以使用message MEL 变量将MuleMessage 传递给java 方法,例如:
<invoke object-ref="Aggregator" method="aggregateSingle" methodArguments="#[message]" doc:name="Invoke"/>
但事实证明,这反而传递了一个MessageContext 对象。但是我需要设置InvocationVariable 所以这个类没有用。我知道我已经在 groovy 中设置了变量,所以也许这会起作用(我想):
<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>
有没有办法使用invoke 将MuleMessage 对象传递给Java 方法?
【问题讨论】:
-
为什么要使用调用组件,然后将其与 Mule API 耦合? ...拥有两种创建组件的方式的想法是,一种方式将您与 Mule API 联系起来,而另一种则没有。
-
@Sudarshan 我想保持 mule 代码干净。我的流程中有两个分支,一个使用
scatter-gather,另一个使用顺序。后者产生与前者的 AggregationStrategy 产生的类似对象。因此,我想重用 AggregationStrategy 中的功能。它还允许进行更细粒度的测试。您是在问我为什么要将MuleMessage(即 Mule API 特定类)传递给我的班级吗?这是因为它比传递 5 个单独的 flowVariables 更容易。 -
+1 解决了您的问题,但是我会考虑创建 5 个 flowVariables 的 POJO 并将 POJO 传递到组件中,特别是如果您正在考虑测试能力和干净的代码。期待答案:)
-
请注意,您可以从 Groovy 调用 POJO,方法是先在注册表中查找它,然后调用它。