为了账号安全,请及时绑定邮箱和手机立即绑定

在 Mule 4.0 中做

在 Mule 4.0 中做

森林海 2023-04-13 10:33:15
我需要在 Mule 4.0 中创建一个“do while”循环。我需要一个将在给定条件下终止的循环。不幸的是,我似乎无法在 Mule 4.0 中执行此操作。使用递归循环,虽然不理想,但在 Mule 3 中可以使用,但在 Mule 4 中不再适用。我也曾经使用 until-successful 范围来循环直到满足特定条件,但是 Mule 4.0 中没有失败表达式,所以我无法检查条件以终止。Mule 4.0 中创建简单的 do-while 循环的前进方向是什么?
查看完整描述

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>


查看完整回答
反对 回复 2023-04-13
?
绝地无双

TA贡献1946条经验 获得超4个赞

Mule 流并不意味着作为一种编程语言工作。您有一个 foreach 范围来迭代事物,DataWeave 有一个功能性的 map() 操作。

递归调用流程被认为是一种不好的做法,应该避免。这是可能的,但它在 Mule 4 中受到限制,因为它很容易导致堆栈溢出错误。

如果您绝对需要这样做,您应该使用 Java 或脚本语言来完成。

也许您可以更深入地描述您试图解决的用例,以防有其他更适合该问题的选项。


查看完整回答
反对 回复 2023-04-13
?
明月笑刀无情

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


查看完整回答
反对 回复 2023-04-13
?
繁星coding

TA贡献1797条经验 获得超4个赞

如果您正在等待服务器上运行的作业在继续之前完成,您可以使用队列实现这种编排——我使用过这种方法。

触发任务后,将消息放在 VM 队列中。在另一个流轮询中,VM 队列具有合理的轮询频率,具体取决于您期望任务完成多长时间。调用服务器以确定任务状态,如果尚未完成,则将消息放回队列中。如果任务已完成,请继续执行您需要执行的任何其他操作。

这种方法可以防止堆栈溢出问题,但如果由于某种原因整个过程需要同步,则这种方法不可行。


查看完整回答
反对 回复 2023-04-13
?
偶然的你

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 &gt; 0]">                          

                        <flow-ref doc:name="getNextPage" name="getNextPage" />

                    </when>

                    <otherwise >

                        <logger level="DEBUG" doc:name="Logger" message="noop" />

                    </otherwise>

                </choice>

            </foreach>


查看完整回答
反对 回复 2023-04-13
  • 5 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信