5 回答

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
我認(rèn)為until-successful這仍然是最好的解決方案,因?yàn)樗鼮槟峁┝艘环N在 X 次嘗試后跳出循環(huán)的方法。只是,不幸的是,需要控制錯(cuò)誤。您可以使用簡單的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貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
Mule 流并不意味著作為一種編程語言工作。您有一個(gè) foreach 范圍來迭代事物,DataWeave 有一個(gè)功能性的 map() 操作。
遞歸調(diào)用流程被認(rèn)為是一種不好的做法,應(yīng)該避免。這是可能的,但它在 Mule 4 中受到限制,因?yàn)樗苋菀讓?dǎo)致堆棧溢出錯(cuò)誤。
如果您絕對需要這樣做,您應(yīng)該使用 Java 或腳本語言來完成。
也許您可以更深入地描述您試圖解決的用例,以防有其他更適合該問題的選項(xiàng)。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
我希望有希望。我在一些答案中看到了DO,但我不知道如何添加條件。至少它有效并且不會(huì)拋出語法錯(cuò)誤
%dw 2.0
output application/json
---
do {
{
n: 1
}
}
Mule 沒有 do-while 的概念。然而,它可以通過一個(gè)小技巧來模仿。唯一一個(gè)迭代(模擬 do)函數(shù)是 reduce,但它只有一個(gè)從迭代傳遞到迭代的累加器。這只有一個(gè)變量應(yīng)該用于累積結(jié)果并指示迭代結(jié)束(模擬 while)。最簡單的方法是使用值作為累加器并使用符號作為指示器。在累積匯總值時(shí),負(fù)結(jié)果表示周期結(jié)束。
%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)
一些復(fù)雜的對象可用于收集結(jié)果,并且還具有作為對象一部分的循環(huán)結(jié)束指示符
%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貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果您正在等待服務(wù)器上運(yùn)行的作業(yè)在繼續(xù)之前完成,您可以使用隊(duì)列實(shí)現(xiàn)這種編排——我使用過這種方法。
觸發(fā)任務(wù)后,將消息放在 VM 隊(duì)列中。在另一個(gè)流輪詢中,VM 隊(duì)列具有合理的輪詢頻率,具體取決于您期望任務(wù)完成多長時(shí)間。調(diào)用服務(wù)器以確定任務(wù)狀態(tài),如果尚未完成,則將消息放回隊(duì)列中。如果任務(wù)已完成,請繼續(xù)執(zhí)行您需要執(zhí)行的任何其他操作。
這種方法可以防止堆棧溢出問題,但如果由于某種原因整個(gè)過程需要同步,則這種方法不可行。

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
以下解決方案使用foreach組件模擬 Mule 循環(huán)中的“循環(huán)”,沒有延遲或觸發(fā)錯(cuò)誤:
<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>
添加回答
舉報(bào)