1

我有一个数组列表值,我使用 foreach 和选择循环。一旦在选择中取得第一次成功,我就想退出 foreach 循环。而且我不想继续检查剩余的条件。在 mulesoft 流中

先感谢您。

4

6 回答 6

0

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

于 2017-01-02T06:10:33.013 回答
0

正如您在用例中提到的那样,message filterfor-loop.

<foreach doc:name="For Each" collection="#[]">
    <message-filter onUnaccepted="flow" >
        <expression-filter expression="#[]"/>
    </message-filter>
</foreach>
于 2017-01-03T13:18:04.710 回答
0

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

 <foreach collection="#[payload.subList(0,3)]" doc:name="For Each">
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
    </foreach>
于 2017-01-04T11:29:09.770 回答
0

您可能无法“中断”foreach 循环,但您始终可以使用表达式/groovy 脚本来实现此功能。请参考:Mule <foreach> 中是否有 break 语句

于 2017-01-04T14:18:55.713 回答
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来查看之前是否满足条件,如果满足,则什么也不做;如下:

<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>

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

于 2017-01-12T02:55:19.923 回答
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
于 2017-12-06T15:13:27.393 回答