小编Fra*_*ski的帖子

在Mule 3.4中模拟while循环

我需要在我的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)

java loops while-loop mule

4
推荐指数
2
解决办法
5516
查看次数

Mule:防止groovy组件覆盖有效负载

我刚刚意识到,当我在我的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)

java groovy mule

4
推荐指数
1
解决办法
3717
查看次数

标签 统计

java ×2

mule ×2

groovy ×1

loops ×1

while-loop ×1