我有一个数组列表值,我使用 foreach 和选择循环。一旦在选择中取得第一次成功,我就想退出 foreach 循环。而且我不想继续检查剩余的条件。在 mulesoft 流中
先感谢您。
我有一个数组列表值,我使用 foreach 和选择循环。一旦在选择中取得第一次成功,我就想退出 foreach 循环。而且我不想继续检查剩余的条件。在 mulesoft 流中
先感谢您。
请根据您的条件使用 Break 语句退出 foreach 循环。
正如您在用例中提到的那样,message filter
将for-loop
.
<foreach doc:name="For Each" collection="#[]">
<message-filter onUnaccepted="flow" >
<expression-filter expression="#[]"/>
</message-filter>
</foreach>
首先,您应该使用 indexOf 方法找出您将在哪个索引上获得成功消息。然后使用 subList 方法获取所需的列表并在 Foreach 循环中使用该列表。
<foreach collection="#[payload.subList(0,3)]" doc:name="For Each">
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</foreach>
您可能无法“中断”foreach 循环,但您始终可以使用表达式/groovy 脚本来实现此功能。请参考:Mule <foreach> 中是否有 break 语句
使用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>
试试这些,如果您需要更多帮助,请告诉我们。
没有组件可以打破 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