我需要在我的Mule Flow中使用while循环来从自定义DAO(我使用Expression Transformer访问DAO)加载数据块,直到他不再提供任何项目.(我不知道DAO提供的项目总数.)Mule 3.4中没有内置while循环.
我的第一个想法是在SubFlow中使用递归反向引用.SubFlow调用自己直到工作完成.但我认为一个"无法解决的循环引用"的springframework异常.流不能自称.
我的下一个想法是写一个Custom Transformer并注入SubFlow来调用循环.我使用了David Dossot在他的回答中描述的一些技术:https://stackoverflow.com/a/16532977/2629741
我遇到的问题不仅是原始Flow中的flowVars在SubFlow中无法访问,而且如果我尝试设置一个flowVar,我会得到一个异常(我使用flowVars进行原始Flow和SubFlow之间的通信) :
org.mule.api.transformer.TransformerMessagingException: null (java.lang.NullPointerException). Message payload is of type: NullPayload
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何使SubFlow中的原始Flow可访问的flowVars(反之亦然)我在Custom Transformer中调用(参见下面的类循环)?
骡子流:
<flow name="test_loopFlow1" doc:name="test_loopFlow1">
<vm:inbound-endpoint exchange-pattern="request-response" path="test_loop" doc:name="VM"/>
<custom-transformer class="com.example.transformer.Loop" doc:name="Java">
<spring:property name="flow" ref="loopTask"/>
</custom-transformer>
</flow>
<sub-flow name="loopTask" doc:name="loopTask">
<logger message="loop" level="WARN" doc:name="Logger"/>
<set-variable variableName="stop" value="true" doc:name="set flowVar"/>
</sub-flow>
Run Code Online (Sandbox Code Playgroud)
环形变压器:
public class Loop
extends AbstractMessageTransformer
implements FlowConstructAware
{
private InterceptingChainLifecycleWrapper _flow = null;
public void setFlow(
final Object value
) {
this._flow = InterceptingChainLifecycleWrapper.class.cast(value);
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我刚刚意识到,当我在我的groovy脚本组件中定义变量时,Mule(3.4)用这个变量覆盖消息有效负载.
def variable = "bar";
Run Code Online (Sandbox Code Playgroud)
在流程到达带有此代码的Groovy组件后,有效负载将更改为"bar".
我该如何防止这种行为?
将Groovy组件放在一个更丰富的程序中似乎是一个解决方案,但是这个扩展器是一种"传输障碍",我必须手动更新每个单独的流变量和我在组件中更改的会话变量.这很容易出错.
完整的流程代码:
<flow name="test-groovyFlow" doc:name="test-groovyFlow">
<http:inbound-endpoint exchange-pattern="request-response" host="0.0.0.0" port="8081" doc:name="HTTP" path="test_groovy"/>
<set-payload value="foo" doc:name="payload = foo"/>
<scripting:component doc:name="do something">
<scripting:script engine="Groovy"><![CDATA[
def variable = "bar";
]]></scripting:script>
</scripting:component>
<scripting:transformer doc:name="Create Response">
<scripting:script engine="Groovy"><![CDATA[
new java.lang.String(
"payload: " + message.payload + "\n"
)
]]></scripting:script>
</scripting:transformer>
</flow>
Run Code Online (Sandbox Code Playgroud)