如何在mulesoft中停止<foreach>循环

时间:2017-01-02 06:04:10

标签: mule mule-studio mule-esb

我有一个数组列表值,我使用foreach和choice循环。一旦第一次成功发生在选择中我想要走出foreach循环。我不想继续检查剩余的条件。在mulesoft流程

提前谢谢。

6 个答案:

答案 0 :(得分:0)

请根据您的条件使用Break语句退出foreach循环。

答案 1 :(得分:0)

正如您在用例中提到的那样 将message filter包裹在for-loop内。

<foreach doc:name="For Each" collection="#[]">
    <message-filter onUnaccepted="flow" >
        <expression-filter expression="#[]"/>
    </message-filter>
</foreach>

答案 2 :(得分:0)

首先,您应该通过使用indexOf方法找出您将获得成功消息的索引。然后使用subList方法获取所需的列表并在Foreach循环中使用该列表。

 <foreach collection="#[payload.subList(0,3)]" doc:name="For Each">
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
    </foreach>

答案 3 :(得分:0)

你可能无法打破&#34;打破&#34; foreach循环,但您始终可以使用expression / groovy脚本来实现此功能。请参阅:Is there a break statement in Mule <foreach>

答案 4 :(得分:0)

使用Groovy

您可以比传统的“for-each”转换器更轻松地控制Groovy脚本的流程。在您的特定情况下,您的groovy脚本看起来像(但不完全)像:

<scripting:component doc:name="Groovy">
 <scripting:script engine="Groovy"><![CDATA[// Define the collection to loop
    def loopCollection = flowVars.nameOfCollectiontoLoop

    // Define the condition which needs to be met
    def exitCondition = "Some condition to match"

    // Loop the collection to do what you need
    loopCollection.each { row ->
        if (row.identifierName == exitCondition)
        {
            return
        }
        else
        {
            // Continue your processing
        }   
    }

    return payload]]></scripting:script>
</scripting:component>

使用Choice策略停止处理

我能想到的另一种方法是在你进入循环后立即使用Choice来查看先前是否满足条件,如果是,则什么都不做;如下:

<flow name="testsFlow">
        <set-variable variableName="conditionMet" value="#[false]" doc:name="conditionMet"/>
        <foreach doc:name="For Each">
            <choice doc:name="Choice">
                <when expression="#[(flowVars.conditionMet == true)]">
                    <scripting:component doc:name="Do nothing">
                        <scripting:script engine="Groovy"/>
                    </scripting:component>
                </when>
                <otherwise>
                    <scripting:component doc:name="Continue Loop">
                        <scripting:script engine="Groovy"><![CDATA[// Define the collection to loop
def loopCollection = flowVars.nameOfCollectiontoLoop

// Define the condition which needs to be met
def exitCondition = "Some condition to match"

// Define the "conditionMet" variable
def conditionMet = flowVars.conditionMet

// Loop the collection to do what you need
loopCollection.each { row ->
    if (row.identifierName == exitCondition)
    {
        conditionMet = true
    }
    else
    {
        conditionMet = false
        // Continue your processing
    }   
}

return payload]]></scripting:script>
                    </scripting:component>
                </otherwise>
            </choice>
        </foreach>
    </flow>

试试这些,如果您需要更多帮助,请告诉我们。

答案 5 :(得分:0)

没有组件可以打破foreach循环。如果您只想处理成功条件,那么您可以使用MEL在子列表上执行foreach,如下所示:

<foreach collection="#[payload<condition>]" />
 ...
</foreach>

您还可以在Groovy中使用循环。

实施例。在有效载荷中我有一些HashMap -

def nap = payload.Result
 for (v in nap)
 {
     if (v.Name == '!!! а папка')
     {
         assert v.Id != null
         flowVars['folderid'] = v.Id
         payload = 'recived Id of folder object is '+v.Id
         break
     }

 }
 return payload