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>
添加回答
舉報