1

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

不幸的是,我似乎无法在 Mule 4.0 中做到这一点。

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

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

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

TIA

4

5 回答 5

3

我认为until-successful仍然是最好的解决方案,因为它为您提供了一种在 X 次尝试后打破循环的方法。只是,不幸的是,需要用错误来控制。您可以使用简单的choiceraise-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>
于 2019-07-23T13:41:02.450 回答
1

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

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

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

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

于 2019-07-23T11:31:09.697 回答
0

我希望有一个希望。我在一些答案中看到了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

于 2020-03-30T11:58:30.603 回答
0

以下解决方案使用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>
于 2020-08-20T13:17:09.283 回答
0

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

触发任务后,将消息放在 VM 队列中。在另一个流程中,根据您期望任务完成的时间,以合理的轮询频率轮询 VM 队列。调用服务器以确定任务状态,如果尚未完成,则将消息放回队列中。如果任务已完成,请继续您需要做的任何其他事情。

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

于 2019-07-23T20:30:31.603 回答