![](/img/trans.png)
[英]Uni<Void> how to get failure or success response at REST call
[英]How to call multiple Uni concurrently
最近,我正在做一個項目,我有 2 個同時進行 2 個異步調用。 由於我正在使用 Quarkus,我最終嘗試使用 Mutiny 和 vert.x 庫。 但是,我無法讓我的代碼與 Unis 一起使用。 在下面的代碼中,我想兩個 Unis 都會被調用,並且返回最快的 Uni 會被返回。 但是,似乎在組合 Unis 時,它只是返回列表中的第一個,即使第一個 uni 應該花費更長的時間。
下面的代碼在應該打印出two two
時打印出one one
,因為 uniFast 應該首先完成。 我如何結合 Unis 並讓更快的一個先返回?
@Test
public void testUniJion(){
var uniSLow = Uni.createFrom().item(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "one";
});
var uniFast = Uni.createFrom().item(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "two";
});
var resp = Uni.join().first(uniSLow,uniFast).withItem().await().indefinitely();
System.out.println(resp);
var resp2 = Uni.combine().any().of(uniSLow,uniFast).await().indefinitely();
System.out.println(resp2);
}
注意:這不是我要實現的實際代碼。 在我的代碼中,我試圖從 2 個不同的數據庫中獲取。 但是,一個數據庫通常比另一個數據庫有更多的延遲。 但是,Uni 似乎總是等待較慢的數據庫。 我只是想更好地理解 Mutiny 和 Uni,所以我制作了這個代碼示例。
問題是你沒有告訴Mutiny
應該在哪個線程上運行每個 uni。 如果我將System.out
添加到您的示例中:
// Slow and Fast for the different Uni
System.out.println( "Slow - " + Thread.currentThread().getId() + ":" + Thread.currentThread().getName() );
我得到以下輸出:
Slow - 1:Test worker
one
Slow - 1:Test worker
Fast - 1:Test worker
one
輸出顯示所有東西都在同一個線程上運行,因此當我們阻塞第一個線程時,第二個線程也被阻塞了。 這就是為什么輸出是one one
的原因。
並行運行 uni 的一種方法是在訂閱時使用不同的執行器:
ExecutorService executorService = Executors.newFixedThreadPool( 5 );
uniSlow = uniSlow.runSubscriptionOn( executorService );
uniFast = uniFast.runSubscriptionOn( executorService );
現在,當我運行測試時,我得到了預期的輸出:
Slow - 16:pool-3-thread-1
Fast - 17:pool-3-thread-2
two
Slow - 18:pool-3-thread-3
Fast - 19:pool-3-thread-4
two
請注意,這一次 Slow 和 Fast 運行在不同的線程上。
Mutiny 指南中有一節介紹了emitOn 與 runSubscriptionOn之間的區別以及一些關於如何更改發射線程的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.