5 回答
TA贡献1844条经验 获得超8个赞
我认为until-successful这仍然是最好的解决方案,因为它为您提供了一种在 X 次尝试后跳出循环的方法。只是,不幸的是,需要控制错误。您可以使用简单的choice处理器raise-error:
<until-successful maxRetries="5">
<http:request method="GET" url="http://something" doc:name="Request" />
<choice>
<when expression="#[payload.status !='OK']">
<raise-error type="APP:REQUEST_NOT_FINISHED"/>
</when>
</choice>
</until-successful>
TA贡献1946条经验 获得超4个赞
Mule 流并不意味着作为一种编程语言工作。您有一个 foreach 范围来迭代事物,DataWeave 有一个功能性的 map() 操作。
递归调用流程被认为是一种不好的做法,应该避免。这是可能的,但它在 Mule 4 中受到限制,因为它很容易导致堆栈溢出错误。
如果您绝对需要这样做,您应该使用 Java 或脚本语言来完成。
也许您可以更深入地描述您试图解决的用例,以防有其他更适合该问题的选项。
TA贡献1828条经验 获得超4个赞
我希望有希望。我在一些答案中看到了DO,但我不知道如何添加条件。至少它有效并且不会抛出语法错误
%dw 2.0
output application/json
---
do {
{
n: 1
}
}
Mule 没有 do-while 的概念。然而,它可以通过一个小技巧来模仿。唯一一个迭代(模拟 do)函数是 reduce,但它只有一个从迭代传递到迭代的累加器。这只有一个变量应该用于累积结果并指示迭代结束(模拟 while)。最简单的方法是使用值作为累加器并使用符号作为指示器。在累积汇总值时,负结果表示周期结束。
%dw 2.0
var x=[1,2,3,4,5]
output application/json
---
-(x reduce (item, acc=0) -> if (item <4 and acc >= 0) acc + item else if (acc>0) -acc else acc)
一些复杂的对象可用于收集结果,并且还具有作为对象一部分的循环结束指示符
%dw 2.0
var x=[1,2,3,4,5]
output application/json
---
(x reduce (item, acc={sum:0}) -> if (item < 4 and acc.end==null ) (acc - 'sum' ++ {sum: acc.sum+item}) else ( acc ++ {end:true} )).sum
https://simpleflatservice.com/mule4/DoWhileImitation.html
TA贡献1797条经验 获得超4个赞
如果您正在等待服务器上运行的作业在继续之前完成,您可以使用队列实现这种编排——我使用过这种方法。
触发任务后,将消息放在 VM 队列中。在另一个流轮询中,VM 队列具有合理的轮询频率,具体取决于您期望任务完成多长时间。调用服务器以确定任务状态,如果尚未完成,则将消息放回队列中。如果任务已完成,请继续执行您需要执行的任何其他操作。
这种方法可以防止堆栈溢出问题,但如果由于某种原因整个过程需要同步,则这种方法不可行。
TA贡献1841条经验 获得超3个赞
以下解决方案使用foreach组件模拟 Mule 循环中的“循环”,没有延迟或触发错误:
<set-variable value="#[1 to 100]" doc:name="loopArray" variableName="loopArray"/>
<foreach doc:name="For Each" collection="#[vars.loopArray]">
<choice doc:name="Choice" >
<when expression="#[vars.hasNextPage > 0]">
<flow-ref doc:name="getNextPage" name="getNextPage" />
</when>
<otherwise >
<logger level="DEBUG" doc:name="Logger" message="noop" />
</otherwise>
</choice>
</foreach>
添加回答
举报