猿问

在 Mule 4.0 中做

我需要在 Mule 4.0 中创建一个“do while”循环。我需要一个将在给定条件下终止的循环。

不幸的是,我似乎无法在 Mule 4.0 中执行此操作。

使用递归循环,虽然不理想,但在 Mule 3 中可以使用,但在 Mule 4 中不再适用。

我也曾经使用 until-successful 范围来循环直到满足特定条件,但是 Mule 4.0 中没有失败表达式,所以我无法检查条件以终止。

Mule 4.0 中创建简单的 do-while 循环的前进方向是什么?


森林海
浏览 145回答 5
5回答

婷婷同学_

我认为until-successful这仍然是最好的解决方案,因为它为您提供了一种在 X 次尝试后跳出循环的方法。只是,不幸的是,需要控制错误。您可以使用简单的choice处理器raise-error:&nbsp; &nbsp; &nbsp; &nbsp;<until-successful&nbsp; maxRetries="5">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <http:request method="GET" url="http://something" doc:name="Request" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <choice>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <when expression="#[payload.status !='OK']">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <raise-error type="APP:REQUEST_NOT_FINISHED"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </when>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </choice>&nbsp; &nbsp; &nbsp; &nbsp; </until-successful>

绝地无双

Mule 流并不意味着作为一种编程语言工作。您有一个 foreach 范围来迭代事物,DataWeave 有一个功能性的 map() 操作。递归调用流程被认为是一种不好的做法,应该避免。这是可能的,但它在 Mule 4 中受到限制,因为它很容易导致堆栈溢出错误。如果您绝对需要这样做,您应该使用 Java 或脚本语言来完成。也许您可以更深入地描述您试图解决的用例,以防有其他更适合该问题的选项。

明月笑刀无情

我希望有希望。我在一些答案中看到了DO,但我不知道如何添加条件。至少它有效并且不会抛出语法错误%dw 2.0output application/json---do {&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; n: 1&nbsp; &nbsp; &nbsp;}&nbsp;}&nbsp;Mule 没有 do-while 的概念。然而,它可以通过一个小技巧来模仿。唯一一个迭代(模拟 do)函数是 reduce,但它只有一个从迭代传递到迭代的累加器。这只有一个变量应该用于累积结果并指示迭代结束(模拟 while)。最简单的方法是使用值作为累加器并使用符号作为指示器。在累积汇总值时,负结果表示周期结束。%dw 2.0var 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)&nbsp;一些复杂的对象可用于收集结果,并且还具有作为对象一部分的循环结束指示符%dw 2.0var 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} )).sumhttps://simpleflatservice.com/mule4/DoWhileImitation.html

繁星coding

如果您正在等待服务器上运行的作业在继续之前完成,您可以使用队列实现这种编排——我使用过这种方法。触发任务后,将消息放在 VM 队列中。在另一个流轮询中,VM 队列具有合理的轮询频率,具体取决于您期望任务完成多长时间。调用服务器以确定任务状态,如果尚未完成,则将消息放回队列中。如果任务已完成,请继续执行您需要执行的任何其他操作。这种方法可以防止堆栈溢出问题,但如果由于某种原因整个过程需要同步,则这种方法不可行。

偶然的你

以下解决方案使用foreach组件模拟 Mule 循环中的“循环”,没有延迟或触发错误:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <set-variable value="#[1 to 100]" doc:name="loopArray"&nbsp; variableName="loopArray"/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <foreach doc:name="For Each" collection="#[vars.loopArray]">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <choice doc:name="Choice" >&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <when expression="#[vars.hasNextPage &gt; 0]">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <flow-ref doc:name="getNextPage" name="getNextPage" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </when>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <otherwise >&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <logger level="DEBUG" doc:name="Logger" message="noop" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </otherwise>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </choice>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </foreach>
随时随地看视频慕课网APP

相关分类

Java
我要回答